在乙個n*m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。
輸入格式:
輸入檔案第一行為兩個整數n,m(1<=n,m<=100),接下來n行,每行m個數字,用空格隔開,0或1.
乙個整數,最大正方形的邊長
輸入樣例#1:
4 4輸出樣例#1:最大正方形即找到向左最長為多少,向上最長為多少,對角線最長到多少,因為是正方形,所以取最小值。0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
f[i,j]表示以[i,j]為右下角的正方形邊長
a[i,j]表示[i,j]處數字是幾。
即 if a[i,j]=1 then f[i,j]:=min(f[i-1,j],min(f[i,j-1],f[i-1,j-1]))+1
因為a[i,j]:=1;所以f[i,j]邊長至少為1,再加上左右對角線所能延伸的最遠距離,由此可以得出;
program p1259;
var f:array[0..1000,0..1000] of longint;
map:array[0..1000,0..1000] of longint;
n,m,i,j,ans:longint;
function
min(a,b:longint):longint;
begin
if a>b then
exit(b);
exit(a);
end;
begin
readln(n,m);
for i:=1
to n do
for j:=1
to m do
begin
read(map[i,j]);
end;
fillchar(f,sizeof(f),0);
for i:=1
to n do
for j:=1
to m do
begin
if map[i,j]=1
then
begin
f[i,j]:=min(f[i-1,j],min(f[i,j-1],f[i-1,j-1]))+1;
end;
end;
ans:=0;
for i:=1
to n do
for j:=1
to m do
begin
if f[i,j]>ans
then
ans:=f[i,j];
end;
write(ans);
end.
測試點 #1:通過該測試點。 得分10,耗時0ms,記憶體7180kb。╮(╯▽╰)╭測試點 #2:通過該測試點。 得分10,耗時0ms,記憶體7196kb。
測試點 #3:通過該測試點。 得分10,耗時15ms,記憶體7258kb。
測試點 #4:通過該測試點。 得分10,耗時31ms,記憶體7360kb。
測試點 #5:通過該測試點。 得分10,耗時0ms,記憶體7532kb。
測試點 #6:通過該測試點。 得分10,耗時15ms,記憶體7553kb。
測試點 #7:通過該測試點。 得分10,耗時0ms,記憶體7561kb。
測試點 #8:通過該測試點。 得分10,耗時0ms,記憶體7540kb。
測試點 #9:通過該測試點。 得分10,耗時15ms,記憶體7565kb。
測試點 #10:通過該測試點。 得分10,耗時0ms,記憶體7565kb。
洛谷 P1387 最大正方形
題目描述 在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。輸入輸出格式 輸入格式 輸入檔案第一行為兩個整數n,m 1 n,m 100 接下來n行,每行m個數字,用空格隔開,0或1.輸出格式 乙個整數,最大正方形的邊長 輸入輸出樣例 輸入樣例 1 4 4 0 1 1 1 1 ...
洛谷P1387 最大正方形
在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。輸入格式 輸入檔案第一行為兩個整數n,m 1 n,m 100 接下來n行,每行m個數字,用空格隔開,0或1.輸出格式 乙個整數,最大正方形的邊長 輸入樣例 1 4 4 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0...
洛谷 P1387 最大正方形
題目大意 在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。思路 先是我個人的奇怪dp,我是覺得這個換成1維的話很像最長遞增子串行。dp i j 2 表示以該點為右下角的最大由1組的的矩形的邊長 dp i j 2 dp i 1 j 1 2 1 當dp i 1 j 1 t 1 ...