码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划-数字三角形V1

时间:2020-05-09 10:39:39      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:main   print   最大值   结构   实现   def   要求   xpath   三角形   

数字三角形
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

标签:main   print   最大值   结构   实现   def   要求   xpath   三角形   

原文地址:https://www.cnblogs.com/an-wl/p/12855651.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!