洛谷 P2701 巨大的牛棚Big Barn

动态规划专题

这道题我觉得不错,是一道基础动规

转移:
d p [ i ] [ j ] 表示以点 ( i , j ) 为右下角的最大正方形的边长
那么转移方程就是
          d p [ i ] [ j ] = m i n ( d p [ i 1 ] [ j 1 ] , d p [ i 1 ] [ j ] , d p [ i ] [ j 1 ] ) + 1

理解一下:

用样例理解一下
这里写图片描述
表示 d p [ i ] [ j ] 的数值,为0的表明那里有树
例如 (3,4)这个点 , (2,4) 的边最多到(2,3),而(3,3)、(2,3)就只能是它自己,所以(3,4)只能也就只能到(2,3)。
其实你自己模拟一遍样例,也就理解了。
source:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[1005][1005],mp[1005][1005];
int main(){
    int n,t,x,y;
    scanf("%d%d",&n,&t);
    for(int i=1;i<=t;i++)
    {
        scanf("%d%d",&x,&y);
        mp[x][y]=1;
    }
    int ans=-1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(!mp[i][j])
            {
                f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
                ans=max(f[i][j],ans);
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jiangbojun2017/article/details/82144903