題目鏈接:P1387 最大正方形
程序說明:
參考了Ice_teapoy大佬的題解 第一個題解。f[i][j]表示a[i][j]左上角的最大正方形邊長。f[i][j] 由 f[i - 1][j],f[i][j - 1],f[i - 1][j - 1] 三者的最小值轉移過來。爲什麼是最小值?因爲比最小值大的話就一定包含0了。三者取最小可以用兩個min函數。
代碼如下:
#include <iostream>
using namespace std;
const int N = 110;
int a[N][N], f[N][N], n, m, res;
int main() {
cin>>n>>m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin>>a[i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(a[i][j] == 1) {
f[i][j] = min(min(f[i - 1][j], f[i][j - 1]), f[i - 1][j - 1]) + 1;
res = max(res, f[i][j]);
}
cout<<res;
return 0;
}