USACO-Section1.5 Number Triangles【动态规划】
2017-06-02 15:25
513 查看
题目描述:
观察下面的数字金字塔。写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大的和,也就是答案啦!(翻译来源:NOCOW)
INPUT FORMAT:
(file numtri.in)第一个行包含 R(1<= R<=1000) ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有提供的整数是非负的且不大于100。
OUTPUT FORMAT:
(file numtri.out)单独的一行,包含那个可能得到的最大的和。
SAMPLE INPUT
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
SAMPLE OUTPUT
30
解题思路:
这道题是标准的动态规划题,通过不断取上一层的肩上两个位置的值来获取最优解。优化思路1:由于输入数据只用一次,可以转化为一个变量来保存。
优化思路2:由于每次都只用到上一层的数据,所以考虑从后往前输入数据(如果从前往后输入,由于前面的数据已改变,会影响后面的结果)。由于是对称三角形,所以输入相反并不影响最终结果,所以可以将二维dp数组转化为一维dp数组。
下面是优化后的代码。
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> int dp[1010],n; int max(int a,int b){ return a>b?a:b; } int main(){ FILE *fin = fopen ("numtri.in", "r"); FILE *fout = fopen ("numtri.out", "w"); fscanf(fin,"%d",&n); int i,j,temp,max1=0; for(i=1;i<=n;i++){ for(j=i;j>=1;j--){//倒序输入数据 fscanf(fin,"%d",&temp); dp[j]=max(dp[j-1]+temp,dp[j]+temp); } } for(i=1;i<=n;i++)//取所有情况中的最大值 max1=max(max1,dp[i]); fprintf(fout,"%d\n",max1); exit(0); }
相关文章推荐
- USACO-Section1.5 Number Triangles [动态规划]
- USACO Section 1.5 Superprime Rib 解题报告
- USACO Training Section 1.5(八皇后升级)
- USACO-Section 1.5 Number Triangles[贪心]
- USACO-Section2.3 Longest Prefix【动态规划】
- C++——USACO Section 1.5 题解
- USACO Section 1.5 Number Triangles - 最最简单最最经典的DP..
- USACO section 1.5 Superprime Rib(深搜)
- USACO Section 1.5: Number Triangles
- USACO Section 1.5
- usaco.section1.4 && 1.5(2015.11.12)
- USACO Section 1.5 Prime Palindromes
- USACO section 1.5 Superprime Rib(深搜)
- 【坐标型动态规划】Number Triangles数字金字塔(Usaco_Training 1.5)
- USACO-Section1.5 Number Triangles [其他]
- USACO Section 1.5 Superprime Rib - 构造数列
- USACO-Section1.5 Prime Palindromes[其他]
- USACO Section1.5 Number Triangles 解题报告
- [动态规划] hdu 3602-2012 和 USACO Section 3.4 Rockers
- USACO Section 1.5 Checker Challenge - 普普通通的皇后问题~~