题目链接:luogu P1387 最大正方形
题目大意:
题解:
(dp[i][j])表示以点((i,j))为右下角,可构成的最大正方形的边长。只有点((i,j))为(1)时,才能作为正方形的右下角。
若(dp[i][j]=x),表示从点((i,j))向上、向左(x)范围内的全部点都是(1)。
状态转移方程:(if((i,j) = 1)) (dp[i][j]=min(dp[i][j-1],dp[i-1][j],dp[i-1][j-1])+1)
#include <iostream>
using namespace std;
#define io_speed_up ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
int dp[110][110], n, m, x, ans;
int main() {
io_speed_up;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> x;
if (x) {
dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
ans = max(ans, dp[i][j]);
}
}
}
cout << ans;
return 0;
}