• 【HIHOCODER 1469 】福字(DP)


    描述


    新年到了,你收到了一副画。你想找到里面最大的福字。
    一副画是一个n × n的矩阵,其中每个位置都是一个非负整数。
    一个福字被定义成是大小为 k 的正方形,满足其中的每个位置上的数都恰好比他的左边的那个和上边的那个大1(如果左边或上边的那个不存在的话就无此要求)。
    比如
    1 2 3
    2 3 4
    3 4 5
    就是一个福字。(注意左上角可以是任何非负整数)。
    你想找到这个矩阵中最大的福字的大小。

    输入


    第一行一个数 n,表示矩阵大小。(n ≤ 1000)
    接下来 n 行,每行 n 个数,表示这个矩阵。矩阵中的数在0到108之间。

    输出


    一行一个数表示最大的福字的大小。

    样例输入

    4
    1 2 3 0
    2 3 4 0
    3 4 5 0
    0 0 0 0
    

    样例输出

    3
    

    题解


    (dp[i][j])代表以坐标(i,j)为右下脚扩展的最大福字,转移方程为:
    (dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]))//具有递推性

    参考代码

    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    #define inf 1000000000
    using namespace std;
    ll read(){
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void Out(ll a){
        if(a<0) putchar('-'),a=-a;
        if(a>=10) Out(a/10);
        putchar(a%10+'0');
    }
    const int N=1005;
    int dp[N][N],a[N][N];
    int main(){
        int n=read(),ans=0;
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)  a[i][j]=read();
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
              if(a[i][j-1]+1==a[i][j]&&a[i-1][j]+1==a[i][j])
                    dp[i][j]=min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j]))+1;
              else dp[i][j]=1;
              ans=max(ans,dp[i][j]);
        }
        Out(ans);
        return 0;
    }
    
    
  • 相关阅读:
    java连接远程linux的redis
    Mac下Sublime Text 3安装配置
    矩阵覆盖
    Mac下配置Tomcat
    用 O(1) 时间检测整数 n 是否是 2 的幂次。
    快速编程之禅
    如何在centos 7.4 上安装 python 3.6
    大众点评实时监控系统CAT的那些坑
    如何在 centos 7.3 上安装 caffe 深度学习工具
    为什么中文编程项目失败率特别高?
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/7189655.html
Copyright © 2020-2023  润新知