问题链接
问题内容
在H*W个边长为1cm的正方形瓷砖,0代表瓷砖有污渍,1代表瓷砖干净。求干净的最大正方形。
思路
dp[i][j]代表从瓷砖(i,j)向左上方扩展可形成的最大正方形。
dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]) + 1
代码
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxx = 1410;
int dp[maxx][maxx], G[maxx][maxx];
int getLargestSquare(int H, int W) {
int maxWidth = 0;
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++) {
dp[i][j] = (G[i][j] + 1) % 2;
maxWidth |= dp[i][j];
}
for (int i = 1; i < H; i++)
for (int j = 1; j < W; j++) {
if (G[i][j]) {
dp[i][j] = 0;
}else {
dp[i][j] = min(dp[i - 1][j - 1],
min(dp[i][j - 1], dp[i - 1][j]) ) + 1;
maxWidth = max(maxWidth, dp[i][j]);
}
}
return maxWidth * maxWidth;
}
int main()
{
int H, W;
scanf("%d %d", &H, &W);
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
scanf("%d", &G[i][j]);
printf("%d\n", getLargestSquare(H, W));
return 0;
}