算法竞赛入门经典 例题9-1

问题:

1

3 2

4 10 1

4 3 2 20

从第一行数开始,每次可以往左下或右下走一格,直到走到最下行,求沿途数之和最大值 及 路径

一开始是这么做的:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<math.h>
 4 #define size 20
 5 using namespace std;
 6 
 7 struct Node{
 8     int val;
 9     int from;
10     int maxval;
11 };
12 
13 void seeking_path(Node* v)
14 {
15     int point = 1;
16     while(v[point].from != 0)
17     {
18         printf("%d -> ", point);
19         point = v[point].from;
20     }
21 }
22 
23 int main()
24 {
25     int Layer;
26     Node v[size];
27     //init
28     for(int i = 0;i < size;i ++)
29         v[i].val = v[i].from =    v[i].maxval = 0;
30     // input
31     //freopen("9-1_in.txt", "r", stdin);
32     scanf("%d", &Layer);
33     for(int i = 1, cnt = 1;i <= Layer;i ++)
34         for(int j = 1;j <= i;j ++)
35             scanf("%d", &v[cnt++].val);
36 
37     if(Layer < 1)
38         printf("wrong!!!\n");
39     else if(Layer == 1)
40         printf("min: %d\n", v[1]);
41     else
42     {
43         // init
44         int head = (Layer-1)*(Layer-2)/2+1;
45 
46         //calculate
47         for(int i = Layer-1;i >= 1;i --)
48         {
49             for(int j = head;(j-head+1) <= i;j ++)
50             {
51                 int left = j+i, right = j+i+1;
52                 if((v[left].maxval+v[left].val) > (v[right].maxval+v[right].val))
53                 {
54                     v[j].from = left;
55                     v[j].maxval = v[left].maxval+v[left].val;
56                 }
57                 else
58                 {
59                     v[j].from = right;
60                     v[j].maxval = v[right].maxval+v[right].val;
61                 }
62             }
63             head -= (i-1);
64         }
65 
66         seeking_path(v);
67         printf("\nmax: %d\n", v[1].maxval+v[1].val);
68     }
69 }
70 
71 //4
72 //1 3 2 4 10 1 4 3 2 20

这道题目可用DP做

更新……

 

 

posted @ 2012-11-09 22:54  川川.aug  阅读(156)  评论(0编辑  收藏  举报