經典樹塔問題DP:s[i][j] = max{s[i+1][j],s[i+1][j+1]} + a[i][j]#include <iostream>#include <cstring>using namespace std;int a[101][101];int s[101][101];int C;int N;int main(){cin>>C;while(C--){cin>>N;for(int i = 1; i <= N; i++){for(int j = 1; j <= i; j++){cin>>a[i][j];}}memset(s,0,sizeof(s));for(int i = 1; i <= N; i++){s[N][i] = a[N][i];}for(int i = N-1; i >= 1; i --){for(int j = 1; j <= i; j++){s[i][j] = max(s[i+1][j],s[i+1][j+1]) + a[i][j];}}cout<<s[1][1]<<endl;}return 0;} 記憶化搜尋:#include <iostream>#include <cstring>using namespace std;int a[101][101];int s[101][101];int C;int N;int DP(int x,int y){if(s[x][y] >= 0)return s[x][y];else{s[x][y] = max(DP(x+1,y),DP(x+1,y+1)) + a[x][y];}return s[x][y];}int main(){cin>>C;while(C--){cin>>N;for(int i = 1; i <= N; i++){for(int j = 1; j <= i; j++){cin>>a[i][j];}}memset(s,-1,sizeof(s));for(int i = 1; i <= N; i++){s[N][i] = a[N][i];}int ans = DP(1,1);cout<<ans<<endl;}return 0;}