标签:
这是一道DP题目,状态转移方程为:
f[i][j] = max(f[i+1][j], f[i+1][j+1]) + arr[i][j];
采用从底向上算的办法,输出f[0][0]即是结果。
当然,也可以从上向下算,f[i][j] = max(f[i-1][j-1], f[i-1][j-1])+arr[i][j],然后从最后一行中求出最大值即可。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main(void) 6 { 7 int test, n; 8 int arr[105][105]; 9 int fun[105][105]; 10 scanf("%d", &test); 11 while(test--) { 12 int i, j; 13 memset(arr, 0, sizeof(arr)); 14 memset(fun, 0, sizeof(fun)); 15 scanf("%d", &n); 16 for(i = 1; i <= n; i++) { 17 for(j = 1 ; j <= i; j++) { 18 scanf("%d", &arr[i][j]); 19 } 20 } 21 22 23 for(j = 1; j <= n; j++) //在这里被坑了,习惯上从0开始 24 fun[n][j] = arr[n][j]; 25 for(i = n-1; i > -1; i--) { 26 for(j = i; j > -1; j--) { 27 int tmp = (fun[i+1][j] > fun[i+1][j+1]) ? fun[i+1][j] : fun[i+1][j+1]; 28 fun[i][j] = tmp + arr[i][j]; 29 } 30 } 31 32 printf("%d\n", fun[1][1]); 33 34 35 36 } 37 return 0; 38 39 }
标签:
原文地址:http://www.cnblogs.com/mylinuxer/p/4354007.html