原题:http://acm.nyist.net/JudgeOnline/problem.php?pid=18
//记忆化dfs
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int v[10000];
int n;
struct node{
int row;
int value;
}tree[10001];
int max(int a,int b){
return a>b?a:b;
}
int dp(int start){
if(v[start]>0){
return v[start];
}
v[start]=tree[start].value;
if(start+tree[start].row+1<=n){
int a=max(v[start],dp(start+tree[start].row)+v[start]);
int b=max(v[start],dp(start+tree[start].row+1)+v[start]);
v[start]=max(a,b);
}
return v[start];
}
int main(){
int t;
while(cin>>t){
memset(v,0,sizeof(v));
int i,j,k;
n=(1+t)*t/2;
int h=0;
for(i=1;i<=t;i++){
k=i;
for(j=0;j<k;j++){
cin>>tree[h].value;
tree[h].row=i;
h++;
}
}
int sum=dp(0);
cout<<sum<<endl;
}
return 0;
}