数塔问题及扩展

来源:互联网 发布:pdf阅读器推荐 知乎 编辑:程序博客网 时间:2024/06/05 17:11

转自:http://hi.baidu.com/bellgrade/blog/item/744365fa3ab7956e034f56d6.html

数塔问题——使用dp求解详细
2009-10-05 13:59

数塔问题描述

如下图所示的数塔,从顶部出发到底层,试着找出一条路径使该路径所走过的数值和最大。


上图中问题解路径就是

使用动态规划求解:

1、 阶段划分

从数塔特点看,应该自下而上逐层决策。

第五层的五个数,做如下的4次决策。

对经过第四层2的路径,第五层的197中选择了19

对经过第四层18的路径,第五层的107中选择了10

对经过第四层9的路径,第五层的104中选择了10

对经过第四层5的路径,第五层的416中选择了16

这可以看作是一次决策的过程,一次递推和降阶过程,因为它使5层的问题变为4层的子问题。

递推出第4层与第5层的和为:

21(2+19), 28(18,10), 19(9+10), 21(5+16),

用同样的方法依次类推,将4层问题变成3层,继而变为1阶,就能得到最优解了。

2、 存储,求解

原始信息存储:层数n和每一层的数据存在data二维数组中。

二维数组d存储内容如下:

d[n][j]=data[n][j]          j=1,2,n

d[i][j]=max(d[i+1][j],d[i+1][j+1])+data[i][j]     

最后d[1][1]就是最优路径的值。

3、 最优解路径的求解

data数组存储内容      数组d存储的内容

9                     59

12 15                50 49

10 6 8              38 34 29

2 18 9 5          21 28 19 21

19 7 10 4 16      19 7 10 4 16

路径的输出:datad数组对照看

输出d[1][1] 中的9

b=d[1][1] – datap[1][1]=59-9=50

bd[2][1],d[2][2]比较,bd[2][1]相等(50),则输出data[2][1]=12

……依次类推就能得到完整路径

9+12+10+18+10=59

扩展:

挖地雷(Mine.pas)

在一个地图上有N个地窖(N<=200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。

【输入格式】

  N  {地窖的个数}

  W1,W2,……WN     {每个地窖中的地雷数}

  X1,Y1            {表示从X1可到Y1}

  X2,Y2

……

0 ,0             {表示输入结束}

【输出格式】

  K1——K2——……——Kv  {挖地雷的顺序}

  MAX                      {最多挖出的地雷数}

【输入样例】Mine.in

6

5 10 20 5 45

1 2

1 4

2 4

3 4

4 5

4 6

5 6

0 0

【输出样例】Mine.out

3-4-5-6

34

这实际是一个有向无环图,每个节点为地雷数,解法应该和上边的数塔类似。


原创粉丝点击