#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int n,a[110][110],f[110][110];
/*int mmax(int a,int b){
return a>b?a:b;
}
int d(int i,int j){
if(f[i][j]>=0) return f[i][j];
return f[i][j]=a[i][j]+(i==n?0:mmax(d(i+1,j),d(i+1,j+1)));
}*/
int d(int i,int j){
int mmax=0,x=0,y=0;
if(f[i][j]>0) return f[i][j];
else{
if(i+1<=n) x=d(i+1,j);
if(i+1<=n&&j+1<=n) y=d(i+1,j+1);
mmax=x>y?x:y;
return f[i][j]=mmax+a[i][j];
}
}
int main(){
memset(f,-1,sizeof(f));
freopen("1220.in","r",stdin);
freopen("1220.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) cin>>a[i][j];
cout<<d(1,1);//初值(1,1)
return 0;
}
题解:记忆化搜索