洛谷1387 最大正方形 解題報告

2022-05-06 05:36:07 字數 1394 閱讀 4072

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

2
列舉/動態規劃

本題有兩種做法:

1.列舉:

列舉矩陣中的每乙個點,然後以這個點為左上角頂點逐層向右下方擴充套件正方形的面積,

當遇到0時,把此點擴充套件的正方形層數(邊長)的平方記錄為當前點擴充套件的最大面積(還要注意邊界處理)。

最後比較各點擴充套件的面積,得出最大正方形面積。

2.動態規劃:

如果資料範圍再大一些的話,列舉法就會顯得力不從心了。我們可以考慮用動態規劃解決,其思想也是非常巧妙的。

定義f[i,j]為以(i,j)為右下角頂點的最大正方形邊長。

當a[i,j]=1時,f[i,j]=min+1;

最大邊長:ans=max   (1<=i<=n,1<=j<=m)

最大面積:ans*ans

下面附上**。

var  

n,m,i,j,max:longint;  

a,f:array[-1..101,-1..101] of longint;  

function min(a,b,c:longint):longint;  

begin  

if a>b then a:=b;  

if a>c then a:=c;  

exit(a);  

end;  

begin  

readln(n,m);  

for i:=1 to n do  

begin  

for j:=1 to n do  

read(a[i,j]);  

readln;  

end;  

for i:=n downto 1 do  

for j:=m downto 1 do  

begin  

if a[i,j]=1 then f[i,j]:=min(f[i+1,j],f[i,j+1],f[i+1,j+1])+1;  

if f[i,j]>max then max:=f[i,j];  

end;  

if max=0 then writeln(1) else writeln(max);  

end.  

洛谷1387 最大正方形

在乙個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 輸出...

洛谷 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...