题目链接:http://acm.hust.edu.cn/vjudge/contest/121396#problem/F
http://lightoj.com/volume_showproblem.php?problem=1004
密码:acm
分析:求从上往下路径的最大权值。
解题思路:数字三角形的变形,把菱形分为上下两部分求即可。dp[i][j]表示路径到第i行第j个点的最大权值和。
*:
上:dp[i][j]=max(dp[i-1][j], dp[i-1][j-1])+maps[i][j];
下:dp[i][j]=max(dp[i-1][j], dp[i-1][j+1])+maps[i][j];
Sample Input 2 4 7 6 4 2 5 10 9 8 12 2 2 12 7 8 2 10 2 1 2 3 1 Sample Output Case 1: 63 Case 2: 5
*********************************************************
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<algorithm> 6 #include<iostream> 7 8 using namespace std; 9 10 #define M 10200 11 #define N 1500///N 开大了就MLE了,~~~~(>_<)~~~~ 12 13 int dp[N][N],maps[N][N]; 14 15 int main() 16 { 17 int n,i,j, T, k=1; 18 19 scanf("%d", &T); 20 21 while(T--) 22 { 23 scanf("%d", &n); 24 25 memset(dp, 0,sizeof(dp)); 26 memset(maps,0,sizeof(maps)); 27 28 for(i=1;i<=n;i++) 29 for(j=1;j<=i;j++) 30 scanf("%d",&maps[i][j]); 31 32 for(i=n+1;i<n*2;i++) 33 for(j=1;j<=n*2-i;j++) 34 scanf("%d", &maps[i][j]); 35 36 dp[1][1]=maps[1][1]; 37 38 for(i=1;i<=n;i++) 39 for(j=1;j<=i;j++) 40 dp[i][j]=max(dp[i-1][j], dp[i-1][j-1])+maps[i][j]; 41 ///上半部分从上到下 42 /*{ 43 dp[i+1][j]=max(dp[i+1][j], dp[i][j]+maps[i+1][j]); 44 dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+maps[i+1][j+1]); 45 }*/ 46 47 48 for(i=n+1;i<n*2;i++) 49 for(j=1;j<=n*2-i;j++) 50 dp[i][j]=max(dp[i-1][j], dp[i-1][j+1])+maps[i][j]; 51 ///下半部分从上到下 52 53 printf("Case %d: %d\n", k++, dp[n*2-1][1]); 54 } 55 return 0; 56 }