The Triangle
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 29626 | Accepted: 17473 |
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 <cstdio>
#include <cstring>
#include <string>
using namespace std;
int n;
int num[110][110];
int memo[110][110];
int dp(int i,int j){
int ret=0;
if(memo[i][j]!=-1) //记忆化搜索避免重复计算
return memo[i][j];
if(i==1) //边界,底层即i = 1的层
return memo[i][j]=num[i][j];
if(i<1||j>n-i+1||j<1) //超出界限
return memo[i][j]=0;
return memo[i][j]=max(dp(i-1,j),dp(i-1,j+1))+num[i][j]; //在左孩子和右孩子中选一个较大的加上本节点的权值
}
int main(){
int i,j;
while(cin>>n){
for(i=0;i<110;i++)
for(j=0;j<110;j++)
memo[i][j]=-1;
for(i=n;i>0;i--)
for(j=1;j<=n-i+1;j++)
scanf("%d",&num[i][j]);
dp(n,1);
cout<<memo[n][1]<<endl;
}
return 0;
}