VIJOS P1057盖房子 (动态规划)

https://vijos.org/p/1057

【题意】在一个 n*m 的土地中 中有瑕疵的为0 完好的为1   其中最大的正方形无瑕疵土地 输出其边长。

【思路】d[i][j]为 以点 i j 为左上角的正方形最大的边长

          显然要是a[i][j]=0 则d[i][j]=0

          要是a[i][j]=1 则 d[i][j]=min(d[i+1][j],d[i+1][j+1],d[i][j+1])+1  ( 画一下图就知道了 )

【注意】for(j=m;j>=1;j--)

                 for(i=n;i>=1;i--)   这样才能保证在算d[i][j]时已经算出  d[i+1][j],d[i+1][j+1],d[i][j+1] 了

 

 

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

int a[1002][1002],d[1002][1002];//d[i][j]以i j 为左上角的顶点

int min(int a,int b,int c)
{
    if(a<=b&&a<=c)
        return a;
    if(b<=a&&b<=c)
        return b;
    return c;
}

int main()
{
    int i,j,n,m,t,k,q;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
            memset(d,0,sizeof(d));
            int maxx=0;
            for(j=m;j>=1;j--)
                for(i=n;i>=1;i--)
                {
                    if(a[i][j]==1)
                         d[i][j]=min(d[i+1][j],d[i+1][j+1],d[i][j+1])+1;
                    else
                        d[i][j]=0;
                    if(maxx<d[i][j])
                        maxx=d[i][j];
                }            
    }    
    return 0;
}

 

posted @ 2013-11-27 21:10  galaxy77  阅读(318)  评论(0)    收藏  举报