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;
}
posted @ 2020-11-22 22:22  ZZHHOOUU  阅读(99)  评论(0编辑  收藏  举报