转自:http://hi.baidu.com/bellgrade/blog/item/744365fa3ab7956e034f56d6.html
数塔问题描述: 如下图所示的数塔,从顶部出发到底层,试着找出一条路径使该路径所走过的数值和最大。
上图中问题解路径就是 使用动态规划求解: 1、 阶段划分 从数塔特点看,应该自下而上逐层决策。 第五层的五个数,做如下的4次决策。 对经过第四层2的路径,第五层的19,7中选择了19 对经过第四层18的路径,第五层的10,7中选择了10 对经过第四层9的路径,第五层的10,4中选择了10 对经过第四层5的路径,第五层的4,16中选择了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 路径的输出:data与d数组对照看 输出d[1][1] 中的9 b=d[1][1] – datap[1][1]=59-9=50 b与d[2][1],d[2][2]比较,b与d[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这实际是一个有向无环图,每个节点为地雷数,解法应该和上边的数塔类似。