Tips
1、递归超时,所以选择用一个数组保存递归的子状态
2、动态规划是由一组小状态确定上一个阶段的某一状态。
3、可以用三角形的最后一行来保存状态,因为之前的状态使用一次之后就不需要了,减少空间复杂度。
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int D[MAX][MAX];
int *maxSum;
int n;
// int MaxSum(int i,int j)
// {
// if(maxSum[i][j]!=-1)
// return maxSum[i][j];
// if(i==n)
// maxSum[i][j]=D[i][j];
// else
// {
// int x=MaxSum(i+1,j);
// int y=MaxSum(i+1,j+1);
// maxSum[i][j]=max(x,y)+D[i][j];
//
// }
// return maxSum[i][j];
//
// }
int main(){
int i,j;
cin>>n;
// for(i=1;i<=n;i++)
// for(j=1;j<=i;j++)
// {
// cin>>D[i][j];
// maxSum[i][j]=-1;
// }
// cout<<MaxSum(1,1)<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
cin>>D[i][j];
maxSum=D[n];
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
maxSum[j]=max(maxSum[j],maxSum[j+1])+D[i][j];
cout<<maxSum[1]<<endl;
return 0;
}