USACO-Section1.5 Number Triangles【动态规划】
来源:互联网 发布:服装erp软件武汉 编辑:程序博客网 时间:2024/06/17 03:36
题目描述:
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
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);}
阅读全文
0 0
- USACO-Section1.5 Number Triangles【动态规划】
- USACO-Section1.5 Number Triangles [动态规划]
- USACO-Section1.5 Number Triangles
- USACO-Section1.5 Number Triangles
- USACO-Section1.5 Number Triangles [其他]
- USACO 1.5 Number Triangles (DP动态规划)
- USACO-Section1.1 Broken Necklace [动态规划]
- Number Triangles(usaco)
- [usaco] Number Triangles
- USACO Number Triangles
- usaco Number Triangles
- USACO:Number Triangles
- USACO-Number Triangles
- USACO Number Triangles
- USACO Number Triangles
- USACO 1.5 Number Triangles
- USACO 1.5-Number Triangles
- USACO 1.5 Number Triangles
- win10里java环境的几个变量
- linux磁盘管理
- iOS Runtime msg_send报错 too many argument to function call
- 回调函数c++实现
- [P1091]合唱队形
- USACO-Section1.5 Number Triangles【动态规划】
- gulp安装:
- jquery选择器选择以指定字符串开头的项
- SoapUI学习(1)- WebService基础
- 如何使用RED HAT CLOUDFORMS REST API 简述
- 大话设计模式阅读笔记-单一职责原则
- 哪些编程语言和操作系统更适合物联网?
- 光纤接头
- JavaScript可选的分号