思路,只有当↖←↑这三个方向都是1时才能组成正方体,所以就能直接得到状态转移方程啦
dp[i][j] = min{dp[i-1][j-1], dp[i][j-1], dp[i-1][j]} + 1 (dp[i][j] != 0)
/**
* 题目: 洛谷OJ P1387 最大正方形
* 题型: DP
**/
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 100+10;
int dp[maxn][maxn], n, m, ans;
int main() {
/************input**************/
cin >> n >> m;
/*******************************/
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> dp[i][j];
if(dp[i][j]) dp[i][j] += min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]));
ans = max(ans, dp[i][j]);
}
}
cout << ans << endl;
return 0;
}