NYOJ-18-The Triangle(动态规划)
2016-07-22 08:45
429 查看
The Triangle
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.
输入
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
输出
Your program is to write to standard output. The highest sum is written as an integer.
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
题意:给出这样的数字三角形,起点是顶点,终点是底边任意一点,每一步可以向下,或者向下后再向左,求出经过数字最大和
思路:状态转移方程DP[i][j]=max(DP[i][j],DP[i-1][j]+map[i][j]),i-1>=1;
DP[i][j]=max(DP[i][j],DP[i-1][j-1]+map[i][j]),i-1>=1&&j-1>=1
代码
做点小优化
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.
输入
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
输出
Your program is to write to standard output. The highest sum is written as an integer.
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
题意:给出这样的数字三角形,起点是顶点,终点是底边任意一点,每一步可以向下,或者向下后再向左,求出经过数字最大和
思路:状态转移方程DP[i][j]=max(DP[i][j],DP[i-1][j]+map[i][j]),i-1>=1;
DP[i][j]=max(DP[i][j],DP[i-1][j-1]+map[i][j]),i-1>=1&&j-1>=1
代码
#include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<iomanip> using namespace std; const int maxn=105; int map[maxn][maxn]; int DP[maxn][maxn]; int main() { int N; while(~scanf("%d",&N)) { for(int i=1; i<=N; i++) for(int j=1; j<=i; j++) scanf("%d",&map[i][j]); memset(DP,0,sizeof(DP)); DP[1][1]=map[1][1]; for(int i=2; i<=N; i++) { for(int j=1; j<=i; j++) { if(i-1>=1&&j-1>=1) DP[i][j]=max(DP[i][j],DP[i-1][j-1]+map[i][j]); if(i-1>=1) DP[i][j]=max(DP[i][j],DP[i-1][j]+map[i][j]); } } int max_num=0; for(int i=1; i<=N; i++) max_num=max(max_num,DP [i]); printf("%d\n",max_num); } return 0; }
做点小优化
#include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<iomanip> using namespace std; const int maxn=105; int map[maxn][maxn]; int DP[maxn][maxn]; int main() { int N; while(~scanf("%d",&N)) { for(int i=1; i<=N; i++) { for(int j=1; j<=i; j++) { scanf("%d",&map[i][j]); DP[i][j]=max(DP[i-1][j],DP[i-1][j-1])+map[i][j]; } } int max_num=0; for(int i=1; i<=N; i++) max_num=max(max_num,DP [i]); printf("%d\n",max_num); } return 0; }
相关文章推荐
- java/反射/JDK新特性
- 25个最受用户喜爱的免费WordPress插件:第1个~第5个
- C语言setpriority()函数:设置程序进程执行优先权
- 612AThe Text Splitting
- Oracle中的不等于号
- setpriority()
- apk前缀debug、release、unaligned的区别
- Java 反射 Array动态创建数组
- C语言getpriority()函数:取得程序进程执行优先权
- Listview 与 Button和Text的焦点冲突问题~
- getpriority()
- 最小公倍数
- C语言nice()函数:改变进程优先顺序
- POJ 3009 Curling 2.0
- 文章标题POJ 2785:4 Values whose Sum is 0?(二分)
- 对于linux下system()函数的深度理解(整理)
- hdu 题目分类
- ssh2工程创建-增删改查排序-上传文件-详细信息
- 单词读音
- 关键字final和override