动态规划-数字三角形V3

数字三角形V3:
递归转成递推:思路就是从下往上推,就相当于,从终点往起点推,找每一步的最大值存下来。
比如第2步中,2,只能与4,5计算,取其最大值,4+2,5+2,所以是7,存下,后续以此类推
最后求到最顶端的值,即是最大路径的值,这样处理,运算速度极快。
当然,存储空间还可以优化,有兴趣的大家可以进一步处理。
第1步:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5 4 5 2 6 5
第2步:
7
3 8
8 1 0
2 7 4 4 7 12 10 10
4 5 2 6 5 4 5 2 6 5
第3步:
7
3 8
8 1 0 20 13 10
2 7 4 4 7 12 10 10
4 5 2 6 5 4 5 2 6 5
第4步:
7
3 8 23 21
8 1 0 20 13 10
2 7 4 4 7 12 10 10
4 5 2 6 5 4 5 2 6 5
第5步:
7 30
3 8 23 21
8 1 0 20 13 10
2 7 4 4 7 12 10 10
4 5 2 6 5 4 5 2 6 5

python算法实现:
 1 def main():
 2     # 为了方便计算,数组的值从1,1位置开始存储
 3     d = [[0] * 101 for j in range(101)]
 4     maxD = [[-1] * 101 for j in range(101)]
 5 
 6     lines = int(input("请输入行数:"))
 7     for i in range(lines):
 8         line = input().split()
 9         for j in range(i + 1):
10             d[i + 1][j + 1] = int(line[j])
11             # 同时给maxD赋值
12             maxD[i + 1][j + 1] = int(line[j])
13     # print(d)
14     # 因为第5行已存储最大值了,所以从第4行开始处理,从后往前递推,
15     # 最后一个二维数组[1][1]的位置即存储最大路径
16     for i in range(lines-1,0,-1):
17         for j in range(1,i+1,1):
18             maxD[i][j] = max(maxD[i + 1][j], maxD[i + 1][j + 1]) + d[i][j]
19 
20     maxPath = maxD[1][1]
21     print("最大路径值为:%d" % maxPath)
22 
23 
24 if __name__ == "__main__":
25     main()

 




posted @ 2020-05-17 11:03  StudyNLP  阅读(144)  评论(0编辑  收藏  举报