您的位置:首页 > 其它

VIJOS P1057盖房子 (动态规划)

2013-11-27 21:10 330 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: