在乙個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分析;我們用f[i][j]表示以該點為右下角的,滿足條件的,最大的正方形的邊長。
先象一下這兩種情況;
(一)如果該點的a為0,f[i][j]=0;
(二)如果它周圍的三個點中有乙個是』0』,那麼那個點的f[i][j]是1(構不成正方
形)
如果它周圍的三個點都能構成正方形,那就要想想。。。
我們從a陣列上分析
那麼
f[i][j]應該是2;
那麼,可以看出是f最小的那個點(或者說是它周圍的那些點)阻礙了f[i][j]的增大。
狀態轉移方程為f[i][j]=minn(f[i-1][j-1],f[i-1][j],f[i][j-1])+1;
#include#include此外還有一種做法(一位同行教的),#include
#include
#include
#include
using
namespace
std;
intn,m;
int a[110][110],f[110][110
],ans;
intmain()
cout
<
return0;
}
主體是:列舉正方形左上角的座標,以及正方形邊長。
方法是:利用 區間和 判斷是否符合。
根據注釋3,複雜度大約是n*m*log ( min(n,m) );還是比較理想的
#include#include#include
#include
#include
#include
using
namespace
std;
int n,m,maxn=1
;int a[110][110],f[110][110
];int
main()
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=maxn;i+k)//(如果在k*k的正方形區間中,區間和是邊長的平方,這個區間一定是飽和的)
printf("%d
",maxn);
return0;
}
P1387 最大正方形
法1 矩陣字首和 n 3 列舉點i,j 和邊長o,如果右下角與左下角之間的數是完全平方數,既是正方形。include include include include include include include include define ll long long using namespace...
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...
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...