The Triangle
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 41970 | Accepted: 25383 |
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
题意:一列数,第一层一个,第二层两个,依次递推,第N层有N个。问从第一层到第N层的一条路径上使得这条路径上的数值和最大。
解题思路:显然是动态规划,在每层的一个状态d(i,j),都可以有a[i][j]+max[d(i+1,j),d(i+1,j+1)]递推得到。
自底向上,依次向上。最后d(1,1)即为最大和。
下面是自底向上的代码;同理自上向底也是可以的。其中最大的路径和在最后一行的其中一个(自上向下结果都分散了而自下向上最后汇聚第一行,第一行只有一点d(1,1)所以自下向上结果就在d(1,1)),所以用自上向下的最后要遍历一次求出最大和。
代码:
自上向下的代码:#include<stdio.h> #include<string.h> int max(int x,int y) { return x>y?x:y; } int main() { int a[120][120],dp[120][120]; int n,i,j; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { for(j=1;j<=i;j++) scanf("%d",&a[i][j]); } for(i=n;i>=1;i--) dp[n][i]=a[n][i]; for(i=n-1;i>=1;i--) { for(j=1;j<=i;j++) dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]); } printf("%d\n",dp[1][1]); } return 0; }
#include<stdio.h> #include<string.h> int max(int x,int y) { return x>y?x:y; } int main() { int a[120][120],dp[120][120]; int n,i,j; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { for(j=1;j<=i;j++) scanf("%d",&a[i][j]); } dp[1][1]=a[1][1]; for(i=2;i<=n;i++) { for(j=1;j<=i;j++) { dp[i][j]=a[i][j]+max(dp[i-1][j-1],dp[i-1][j]); } } int s=-1; for(i=1;i<=n;i++) //遍历最后一行求出最大和; if(dp[n][i]>s) s=dp[n][i]; printf("%d\n",s); } return 0; }