第十七章 DPL_3_A:Largest Square 最大正方形

问题链接

DPL_3_A:Largest Square

问题内容

在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;
}

猜你喜欢

转载自blog.csdn.net/u013075699/article/details/78946139