动态规划习题 poj1163
原题:
The Triangle
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 28546 | Accepted: 16809 |
Description
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)
Input
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.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output
30
题目要求:
输入三角形如图所示:在下面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都是能往左下或右下走。只需要求出最的和即可,不需要输出路径。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
题目解析:
用二维数组way[][]靠左存储三角形内的数据,如下图:
0 0
0 7 0
0 3 8 0
0 8 1 0 0
0 2 7 4 4 0
0 4 5 2 6 5 0
利用动态规划:way[i][j]=way[i][j]+max(way[i-1][j-1],way[i-1][j])
代码:
#include<iostream> using namespace std; int max(int a,int b) { return a>b?a:b; } int main() { int n; int i,j; while(cin>>n) { int **way=new int*[n+1]; //动态申请二维数组的第一维,每个元素都是一个一维数组的指针 /*Input & Initial*/ for(i=0;i<=n;i++) { way[i]=new int[i+2]; //动态申请二维数组的第二维,每一行的空间 for(j=0;j<=i+1;j++) way[i][j]=0; //不能用memset初始化 if(i!=0) for(j=1;j<=i;j++) cin>>way[i][j]; } /*Dp*/ int max_weight=0; for(i=1;i<=n;i++) for(j=1;j<=i;j++) { way[i][j] += max(way[i-1][j-1],way[i-1][j]); if(i==n && max_weight<way[i][j]) max_weight=way[i][j]; } cout<<max_weight<<endl; delete[] way; } return 0; }