解题报告 keke 的房子
?
1.??????? 題目
??????????????? Keke的房子
Description
keke得到了一塊n*m的土地,他灰常高興,于是他想要蓋個房子,keke的房子必須是正方形的。
但是,并不是土地的每個地方都能蓋房子。地面上有一些地方不能蓋一磚一瓦。
他當然希望將房子蓋得大一些,房子越大就越舒服(有道理沒有?)。
于是他又來惡心你了……
Input
輸入文件第一行為兩個整數(shù)n,m(1<=n,m<=1000),接下來n行,每行m個數(shù)字,用空格隔開。0表示該塊土地不能蓋房子,1表示該塊土地完好。
Output
一個整數(shù),為keke能蓋出的最大正方形房子的邊長
Sample Input
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
Sample Output
2
數(shù)據(jù)范圍
對于30%的數(shù)據(jù) n,m<=100
對于100%的數(shù)據(jù) n,m<=1000
?
2.??????? 題目實質(zhì)
找一個指定區(qū)域內(nèi),不經(jīng)過指定區(qū)域的最大的正方形的邊長。
3.??????? 算法
動態(tài)規(guī)劃。
其實這個題還有一個更難的三角形版,也是需要從鄰近的幾個方向進行轉(zhuǎn)移。
用 f[I,j] 存右下點為 I,j 的最大的正方形的邊長,然后由畫圖 + 手模(手工模擬)得,最大正方形的邊長應(yīng)為與該格子左邊相鄰、上邊相鄰,或是與他的左上頂點相切的三個正方形中最小的那個的邊長 + 1 。
然后,就實現(xiàn)就行了。
然后三角形版是需要從三個方向取最小的進行轉(zhuǎn)移,然后走一遍正三角形,走一遍倒三角形。
4.??????? 注意事項
這個題一定要動態(tài)規(guī)劃,搜索最后兩個點超時。
這個題的手模略。
5.??????? 程序代碼
艾 FHAI? (Pascal)
var
f,a:array[0..1003,0..1003]of longint;
ans,tt,n,i,j,m:longint;
function min(a,b:longint):longint;
begin
if a<b then exit(a);
exit(b);
end;
begin
assign(input,'house.in');reset(input);
assign(output,'house.out');rewrite(output);
readln(n,m);
for i:=1to n do
???? begin
???? for j:=1 to m do
????????? read(a[i,j]);
???? readln;
???? end;
for i:=1 to n do
???? for j:=1 to n do
???? if a[i,j]=1 then
????????? begin
????????? tt:=min(f[i,j-1],f[i-1,j]);
????????? tt:=min(tt,f[i-1,j-1]);
????????? f[i,j]:=tt+1;
????????? if f[i,j]>ans then ans:=f[i,j];
????????? end;
write(ans);
close(input);close(output);
end.
轉(zhuǎn)載于:https://www.cnblogs.com/SueMiller/archive/2011/08/12/2136258.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的解题报告 keke 的房子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript事件捕获与事件冒泡原
- 下一篇: Rejection sampling -