杭电2084
2015-10-18 16:44
344 查看
数塔
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
已经告诉你了,这是个DP的题目,你能AC吗?
Input
输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
Output
对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
Sample Input
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
错误代码:
# include <iostream> # include <cstring> using namespace std; int a[103][103]; int sum[103][103]; int main(){ int n,m,i,j,k,T; while(cin>>T){ while(T--){ cin>>n; for(i=0;i<n;i++){ for(j=0;j<=i;j++){ cin>>a[i][j]; } } memset(sum,0,sizeof(sum)); for(i=0;i<n;i++){ for(j=0;j<=i;j++){ if(i==0||j==i){ sum[i][j]+=a[i][j]; }else if(sum[i-1][j-1]>=sum[i-1][j]){ sum[i][j]+=sum[i-1][j-1] + a[i][j]; }else{ sum[i][j]+=sum[i-1][j] + a[i][j]; } } } int max = -3; for(i=0;i<n;i++){ if(sum[n-1][i]>max){ max = sum[n-1][i]; } } cout<<max<<endl; } } return 0; }
正确代码:
# include <iostream> # include <cstring> using namespace std; int dp[103][103]; int main(){ int n,m,i,j,k,T; while(cin>>T){ while(T--){ cin>>n; for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ cin>>dp[i][j]; } } for(i=n-1;i>=1;i--){ for(j=1;j<=i;j++){ if(dp[i+1][j+1]> dp[i+1][j]){ dp[i][j] += dp[i+1][j+1]; }else { dp[i][j] += dp[i+1][j]; } } } cout<<dp[1][1]<<endl; } } return 0; }
相关文章推荐
- iOS中通知中心NSNotificationCenter的应用
- Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)
- Android Listview的分组实现
- 2014 ACM亚洲区域赛 - 北京现场赛
- js错误处理
- OGRE 所有版本(从0.1到1.7) (SDK 及 源码 及 扩展库) 下载地址
- 自定义UIImageView添加响应事件
- struts2中Included file cannot be found问题解决
- define和typedef的区别,typedef struct的用法
- 在centos上搭建阿里云python开发环境
- OC学习笔记 (10-15-18)
- leetcode 38:Count and Say
- 【codevs3304】水果姐逛水果街Ⅰ 线段树练习
- NYOJ——205 求余数
- 去除快捷键小箭头
- iOS开发_使用百度云推送实现app消息推送
- Heartbeat crm的配置
- 九度OJ 1033:继续xxx定律 (基础题)
- shell基础
- 九度OJ 1033:继续xxx定律 (基础题)