问题:
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做
更新……