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