理論上來說可以暴力列舉邊長和右下角座標,而且似乎有人能用這方法過這道題。。。
不過列舉太不現實,而且資料強一點的話就徹底沒辦法了,還是要dp。
用兩個陣列l,w分別儲存每個位置(包括本身)向左和向上各有幾個連續的1,如果乙個位置是1,這個位置的w和l就能從別的位置轉移過來。(似乎預處理能與輸入一起完成?不過我沒這麼做。)
然後對f陣列進行處理,對於每乙個正方形,我們都可以把它看作是一層一層的,像這樣:
第一層:
1
第二層:
0 1
1 1
第三層:
0 0 1
0 0 1
1 1 1
如果能構成正方形,那麼前面的幾層都必須是完整的。對於每乙個a[i][j]==1的位置,f[i][j]的取值為f[i-1][j-1]+1,l[i][j]與w[i][j]的最小值
插一句,luogu上資料略水,處理f的時候把m寫成n居然都有90分。。。
#includevoid read(int &y)}int n,m,a[105][105
],ans;
int f[105][105],l[105][105],w[105][105
];int min(int x,int
y)int
main()
for(int i=1;i<=n;i++)}}
for(int i=1;i<=n;i++)}}
printf("%d
",ans);
return0;
}
洛谷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 最大正方形
法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...