洛谷1387 最大正方形

2021-07-05 10:12:26 字數 1863 閱讀 6882

在乙個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 1

輸出樣例#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 ...