算法竞赛入门经典 例题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做
更新……