luogu P1387 最大正方形
题目链接: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;
}