#include<stdio.h> int main() { int n,m; int a[150][150]; scanf("%d",&n); while(n--) { scanf("%d",&m); for(int i=1;i<=m;i++) for(int j=0;j<i;j++) scanf("%d",&a[i-1][j]); for(int i=m;i>1;i--) for(int j=0;j<i-1;j++) { if(a[i-1][j]>a[i-1][j+1])a[i-2][j]+=a[i-1][j]; else a[i-2][j]+=a[i-1][j+1]; } printf("%d\n",a[0][0]); } return 0; }
解题思路
求经过的结点的最大和,从最后一层看起。
将倒数第二层的各个元素加上下层中两边的结点较大者
然后一层一层往上加,直至最后一层。
输出塔顶元素,即为解。