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