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
从上往下推:#include <iostream> #include <cstring> using namespace std; int main() { int data[105][105],dp[105][105]; int n,i,j,t; while(cin>>n) { memset(data,0,sizeof(data));//初始化data memset(dp,0,sizeof(dp));//初始化dp cin>>data[1][1]; for(i=2,dp[1][1]=data[1][1];i<=n;i++) for(j=1;j<=i;j++) { cin>>data[i][j]; dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+data[i][j];//方程,求出子问题的最优解 } for(i=1,t=0;i<=n;i++)//从最后一行选出最大的值输出 if(t<=dp[n][i]) t=dp[n][i]; cout<<t<<endl; } return 0; }
从下往上推:
#include <iostream> #include <cstring> using namespace std; int main() { int i,j,n; int data[360][360],dp[360][360]; while(cin>>n) { memset(data,0,sizeof(data)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) for(j=1;j<=i;j++) cin>>data[i][j]; for(i=n;i>0;i--) for(j=1;j<=i;j++) dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+data[i][j]; cout<<dp[1][1]<<endl; } return 0; }