【HIHOCODER 1469 】福字(DP)
2017-07-16 09:17
141 查看
描述
新年到了,你收到了一副画。你想找到里面最大的福字。一副画是一个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 ,a ; 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; }
相关文章推荐
- hihocoder 1469 福字 (dp)
- hihoCoder Challenge 27 #1469 : 福字 dp
- hihoCoder挑战赛27题目一 福字 (dp)
- hihoCoder Challenge 27 #1469 : 福字 【简单dp】
- hihoCoder 1259 A Math Problem(数位dp)
- hihoCoder 1259 A Math Problem 数位dp
- hihoCoder1318—非法二进制数(数位dp)
- hihocoder 1580 dp最大子矩阵和
- 【HIHOCODER 1320】压缩字符串(区间DP)
- hihoCoder 1170 机器人 (状压dp)
- hihocoder 1290 Demo Day 二维图的dp
- HihoCoder 1063 : 缩地 树形DP第二题(对象 边)
- hihocoder 1033 交错和 数位DP
- 2017 ICPC 北京站 H (hihocoder 1634) Puzzle Game (dp 最大子矩阵和)
- hihocoder 1124 : 好矩阵 dp
- hihoCoder 1075 开锁魔法III (dp,划分阶段)
- hihocoder 1158 质数相关 dp
- hihoCoder 1159 扑克牌 (dp,难)
- hihocoder 树形DP 背包问题
- HihoCoder - 1044 状态压缩·一 状态压缩dp