动态规划-数字三角形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的主要内容,如果未能解决你的问题,请参考以下文章