【USACO TRAINING】数字金字塔(DP)
来源:互联网 发布:淘宝上传图片 编辑:程序博客网 时间:2024/05/18 00:04
问题 A(1036): 【USACO TRAINING】数字金字塔
时间限制: 1 Sec 内存限制: 64 MB题目描述
考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
输入
第1行:1个整数R(1<= R<=1000),表示行的数目。
接下来共R行,第i行有i个整数。所有的数均非负的且不大于100。
输出
第1行:可以得到的最大的和。
样例输入
573 88 1 02 7 4 44 5 2 6 5
样例输出
30
史上经典的一道DP题,
很简单的就可以推出 f [ i ][ j ] = max( f[ i+1 ][ j ],f[ i+1 ][ j+1 ] ) + A[ i ][ j ];
方法如下
(1)暴搜
显然会时间超限
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;#define MAXN 1000#define MAXM#define INF 0x3f3f3f3f#define LL long longint map[MAXN+10][MAXN+10];int N;int dfs(int x,int y){if(x==N)return map[x][y];int max_=max(dfs(x+1,y),dfs(x+1,y+1));return map[x][y]+max_;}int main(){scanf("%d",&N);int i,j;for(i=1;i<=N;++i)for(j=1;j<=i;++j)scanf("%d",&map[i][j]);printf("%d\n",dfs(1,1));}
(2)记忆化搜索
那么我们的方法(1)是否可以优化?
很明显,我们在搜索的过程中会不断调用同一子问题,导致时间超限,于是我们不妨记录下子问题的解。
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;#define MAXN 1000#define MAXM#define INF 0x3f3f3f3f#define LL long longint map[MAXN+10][MAXN+10];bool vis[MAXN+10][MAXN+10];int N;int dfs(int x,int y){if(vis[x][y])return map[x][y];vis[x][y]=1;return map[x][y]=map[x][y]+max(dfs(x+1,y),dfs(x+1,y+1));}int main(){scanf("%d",&N);int i,j;for(i=1;i<=N;++i)for(j=1;j<=i;++j)scanf("%d",&map[i][j]);memset(vis,0,sizeof(vis));for(j=1;j<=N;++j)vis[N][j]=1;printf("%d\n",dfs(1,1));}
(3)DP
动态规划有很多种实现方法,例如
刷表法:
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std; #define MAXN 1000#define MAXM#define INF 0x3f3f3f3f#define LL long long int map[MAXN+10][MAXN+10];int f[MAXN+10][MAXN+10];int N; int main(){ scanf("%d",&N); int i,j; for(i=1;i<=N;++i) for(j=1;j<=i;++j) scanf("%d",&map[i][j]); memset(f,0,sizeof(f)); for(j=1;j<=N;++j) f[N][j]=map[N][j]; for(i=N;i>=2;--i) for(j=1;j<=i;++j) { if(j<i)f[i-1][j]=max(f[i-1][j],map[i-1][j]+f[i][j]); if(j>1)f[i-1][j-1]=max(f[i-1][j-1],map[i-1][j-1]+f[i][j]); } printf("%d\n",f[1][1]);}
填表法:
由下到上:
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std; #define MAXN 1000#define MAXM#define INF 0x3f3f3f3f#define LL long long int map[MAXN+10][MAXN+10];int f[MAXN+10][MAXN+10];int N; int main(){ scanf("%d",&N); int i,j; for(i=1;i<=N;++i) for(j=1;j<=i;++j) scanf("%d",&map[i][j]); memset(f,0,sizeof(f)); f[1][1]=map[1][1]; for(i=2;i<=N;++i) for(j=1;j<=i;++j) { if(j<i)f[i][j]=max(f[i][j],map[i][j]+f[i-1][j]); if(j>1)f[i][j]=max(f[i][j],map[i][j]+f[i-1][j-1]); } int max_f=0; for(j=1;j<=N;++j) max_f=max(max_f,f[N][j]); printf("%d\n",max_f);}
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std; #define MAXN 1000#define MAXM#define INF 0x3f3f3f3f#define LL long long int map[MAXN+10][MAXN+10];int f[MAXN+10][MAXN+10];int N; int main(){ scanf("%d",&N); int i,j; for(i=1;i<=N;++i) for(j=1;j<=i;++j) scanf("%d",&map[i][j]); memset(f,0,sizeof(f)); for(j=1;j<=N;++j) f[N][j]=map[N][j]; for(i=N-1;i>=1;--i) for(j=1;j<=i;++j) { f[i][j]=max(f[i][j],map[i][j]+f[i+1][j]); f[i][j]=max(f[i][j],map[i][j]+f[i+1][j+1]); } printf("%d\n",f[1][1]);}
2 0
- 【USACO TRAINING】数字金字塔(DP)
- 【USACO TRAINING】数字金字塔
- USACO 1.5 Number Triangles 数字金字塔(经典dp)
- C++动态规划算法之数字金字塔【USACO TRAINING】:一道经典的数塔问题
- [USACO Training] Broken Necklace (DP)
- [DP]数字金字塔
- Usaco 1.5.1 数字金字塔(Number Triangles)
- USACO:1.5.1 Number Triangles 数字金字塔
- USACO——Number Triangles 数字金字塔
- USACO 1.5 数字金字塔
- USACO 1.5 数字金字塔 Number Triangles
- CCF NOI1145 数字金字塔【DP】
- 洛谷 1216——USACO 1.5 数字金字塔(递推与递归二分)
- 字母金字塔(类同数字金字塔)
- 数字金字塔(动态规划)
- 数字金字塔(动态规划)
- 数字金字塔(逆推)
- 数字金字塔(动态规划)
- android安装内核module,提示Required key not
- jsp显示数据库的查询结果
- 微信硬件平台设备直连全讲解(6)设备端SDK导入和设备登陆
- iOS 如何把项目托管到GitHub
- opencv_contrib 添加cuda支持
- 【USACO TRAINING】数字金字塔(DP)
- Animation and Graphics partⅡ Property Animation
- android应用如何在发布市场时关掉所有的Log日志输出
- 分布式存储ceph系统性能不稳定因素
- 有限元分析思路
- 正则表达式学习笔记
- io学习之read(char[])方法的使用
- Test
- 全屏提醒Windows 10免费升级,最后倒计时