查看原题目请点我这里
解题思路
题目已经说了这是动态规划的题,需要注意的地方是可以用滚动数组节省空间,注意是从前面往后面滚动,因为前面的数值一旦确定以后在当前行就不会再使用。

#include<cstdio>
#include<cstring>
int arr[110][110];
int max(int a,int b){
    return a>b?a:b;
}
int main(){
    int c,n;
    scanf("%d",&c);
    while(c--){
        scanf("%d",&n);
        memset(arr,0,sizeof(arr));
        for(int i=0;i<n;i++){
            for(int j=0;j<=i;j++){
                scanf("%d",&arr[i][j]);
            }
        }
        int dp[110];
        memset(dp,0,sizeof(dp));
        for(int j=0;j<n;j++){
            dp[j]=arr[n-1][j];
        }
        for(int i=n-2;i>=0;i--){
            for(int j=0;j<=i;j++){
                dp[j]=max(dp[j],dp[j+1])+arr[i][j];
            }
        }
        printf("%d\n",dp[0]);   
    }
    return 0;
}