动态规划-数字三角形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()