您的位置:首页 > 其它

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

2012-11-09 22:54 295 查看
问题:

1

3 2

4 10 1

4 3 2 20

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

一开始是这么做的:

#include<iostream>
#include<stdio.h>
#include<math.h>
#define size 20
using namespace std;

struct Node{
int val;
int from;
int maxval;
};

void seeking_path(Node* v)
{
int point = 1;
while(v[point].from != 0)
{
printf("%d -> ", point);
point = v[point].from;
}
}

int main()
{
int Layer;
Node v[size];
//init
for(int i = 0;i < size;i ++)
v[i].val = v[i].from =    v[i].maxval = 0;
// input
//freopen("9-1_in.txt", "r", stdin);
scanf("%d", &Layer);
for(int i = 1, cnt = 1;i <= Layer;i ++)
for(int j = 1;j <= i;j ++)
scanf("%d", &v[cnt++].val);

if(Layer < 1)
printf("wrong!!!\n");
else if(Layer == 1)
printf("min: %d\n", v[1]);
else
{
// init
int head = (Layer-1)*(Layer-2)/2+1;

//calculate
for(int i = Layer-1;i >= 1;i --)
{
for(int j = head;(j-head+1) <= i;j ++)
{
int left = j+i, right = j+i+1;
if((v[left].maxval+v[left].val) > (v[right].maxval+v[right].val))
{
v[j].from = left;
v[j].maxval = v[left].maxval+v[left].val;
}
else
{
v[j].from = right;
v[j].maxval = v[right].maxval+v[right].val;
}
}
head -= (i-1);
}

seeking_path(v);
printf("\nmax: %d\n", v[1].maxval+v[1].val);
}
}

//4
//1 3 2 4 10 1 4 3 2 20


这道题目可用DP做

更新……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: