思路:从下往上,每个位置的DP元素存的是以此为顶点的最大值,第一行的DP值等于本身,然后每次上升一行来填表,输出顶端元素的DP值。
(有意思的是用C++编译后TLE,改用G++后成了最快解,哭笑不得)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define MAX 105 5 6 int main(void) 7 { 8 int c,n; 9 int dp[MAX][MAX]; 10 11 scanf("%d",&c); 12 while(c --) 13 { 14 scanf("%d",&n); 15 for(int i = 1;i <= n;i ++) 16 for(int j = 1;j <= i;j ++) 17 scanf("%d",&dp[i][j]); 18 19 for(int i = n - 1;i >= 1;i --) 20 for(int j = 1;j <= i;j ++) 21 dp[i][j] += dp[i + 1][j] > dp[i + 1][j + 1] ? dp[i + 1][j] : dp[i + 1][j + 1]; 22 printf("%d ",dp[1][1]); 23 } 24 25 return 0; 26 }