sdau三 1006
来源:互联网 发布:java md5怎么用 编辑:程序博客网 时间:2024/05/03 19:00
问题:
在讲述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
分析:
简单DP,状态转移方程为max[i,j]=max{[i-1][j-1],[i-1][j]}+a[i][j],目前位置的最大值为上两个位置中最大值加目前位置的值。
代码:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;int n;/*bool border(int a,int b){ if(a<1||b>n) return 0; else return 1;}*/int main(){ //freopen("s.txt","r",stdin); int c; cin>>c; while(c--){ int a[101][101],i,j,sum=0; cin>>n; memset(a,0,sizeof(a)); for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ cin>>a[i][j]; } } sum=a[1][1]; for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ if(i==1) continue; else{ a[i][j]=max(a[i-1][j-1],a[i-1][j])+a[i][j]; } if(a[i][j]>sum) sum=a[i][j]; } } //max[i,j]=max{[i-1][j-1],[i-1][j]}+a[i][j]; cout<<sum<<endl; } return 0;}
0 0
- sdau三 1006
- 2016SDAU编程练习三1006
- 2016sdau课程练习专题三 1006
- 2016SDAU课程练习三1006
- SDAU 1006
- SDAU练习三 10001
- SDAU练习三1001
- SDAU练习三1003
- SDAU练习三1004
- SDAU练习三1005
- SDAU练习三 1008
- SDAU练习三 1014
- sdau练习三1016
- SDAU练习三1017
- SDAU练习三1018
- SDAU练习三1023
- SDAU练习三1019
- SDAU练习三1020
- pod1.0后安装第三方库后无法通过编译
- Android 用ffmpeg生成Gif 各种排列组合的性能测试结果
- 传值
- ajax跨域问题
- 汉字的unicode范围
- sdau三 1006
- 高仿网易新闻栏目动画效果
- [从头学数学] 第230节 微分中值定理与导数的应用
- 更新应用手机上会出现两个图标,删也删不掉。
- 【Android】Android开发点击查看手机电量的小功能。学习广播的一个小技能小Demo
- 聊天(环信)
- ajax无刷新分页
- XListView 的配置
- Android .9图片的使用方法