动态规划-数字三角形V1

Posted an-wl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划-数字三角形V1相关的知识,希望对你有一定的参考价值。

数字三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。
路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。
三角形的行数大于1小于等于100,数字为 0 - 99

输入格式:
5 //三角形行数。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和

解题思路:使用动态规划,构建二维数组,数组中的数值表示到达当前节点的累计最大值,
运用动态规划解决的问题必须是希望在每个子问题上获得最优解(称为最优子结构)

用二维数组存放数字三角形。D( r, j) : 第r行第 j 个数字(r,j从1开始算)
MaxSum(r, j) : 从D(r,j)到底边的各条路径中,最佳路径的数字之和。
问题:求 MaxSum(1,1),典型的递归问题。
D(r, j)出发,下一步只能走D(r+1,j)或者D(r+1, j+1)。故对于N行的三角形:
if ( r == N)
MaxSum(r,j) = D(r,j)
else
MaxSum( r, j) = Max{ MaxSum(r+1,j), MaxSum(r+1,j+1) }+ D(r,j)

Python代码实现:
 1 # 为了方便计算,数组的值从1,1位置开始存储
 2 d = [[0] *101 for j in range(101)]
 3 
 4 
 5 def MaxSum(i, j, rows):
 6     if i == rows:
 7         return d[i][j]
 8     else:
 9         x = MaxSum(i + 1, j, rows)
10         y = MaxSum(i + 1, j + 1, rows)
11         return max(x, y)+d[i][j]
12 def main():
13     global d
14     lines = int(input("请输入行数:"))
15     for i in range(lines):
16         line = input().split()
17         for j in range(i + 1):
18             d[i + 1][j + 1] = int(line[j])
19     # print(d)
20     maxPath = MaxSum(1,1,lines)
21     print("最大路径值为:%d"%maxPath)
22 
23 if __name__ == "__main__":
24     main()

 

 

以上是关于动态规划-数字三角形V1的主要内容,如果未能解决你的问题,请参考以下文章

动态规划_线性动态规划,区间动态规划

动态规划问题

[动态规划]数字三角形

动态规划

动态规划数字三角形

动态规划—数字三角形