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;
}