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;
}
原文地址:https://www.cnblogs.com/IzumiSagiri/p/14021911.html