题目链接: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 }

 

posted on 2016-08-03 09:36  惟愿。。。  阅读(205)  评论(0编辑  收藏  举报