题目
如下图,从上往下找一条路径,使得这条路径上数字的和达到最大。从当前节点往下,只能选择该节点的左分支或右分支,比如从第一层的13可以选择11或者8,如果选择8,则再下一层只能选择7或26。
回溯法
用回溯法遍历出所有的路径,然后比较所有路径的和,和最大的那条路径就是我们要找的路径。下面是代码。
def search(input_para, depth, x, y, one_path, all_path):
"""
数字金字塔
:param input_para: 输入的参数
:param depth: 深度
:param x: 行
:param y: 列
:param one_path: 当前的路径
:param all_path: 存储所有的路径
"""
if depth == len(input_para): # 结束条件
# 打印路径
print(one_path)
all_path.append(one_path[:])
else: # 未结束
# ======= 选择左下方的值(由于数组的放置的位置都是从0开始,所以这里其实是正下方的值) ======
# 设置现场
one_path.append(input_para[depth][y])
# 递归
search(input_para, depth+1, x+1 , y, one_path, all_path)
# 恢复现场
one_path.pop()
# ====== 选择右下方的值(由于数组的放置的位置都是从0开始,所以这里其实是正下方右边+1位置的值) ======
# 设置现场
one_path.append(input_para[depth][y+1])
# 递归
search(input_para, depth+1, x+1, y+1, one_path, all_path)
# 恢复现场
one_path.pop()
调用上面的方法。
input_para = [
[13],
[11, 8],
[12, 7, 26],
[6, 14, 15, 8],
[12, 17, 13, 24, 11]
]
one_path = [input_para[0][0]]
all_path = []
search(input_para, 1, 0, 0, one_path, all_path)
max = 0
max_index = 0
for index, this_path in enumerate(all_path):
if sum(this_path) > max:
max = sum(this_path)
max_index = index
print('最大值为:',max)
print('最大值对应的路径为:', all_path[max_index])
输出的结果如下,打印所有路径,同时输出路径和最大的路径。
[13, 11, 12, 6, 12]
[13, 11, 12, 6, 17]
[13, 11, 12, 14, 17]
[13, 11, 12, 14, 13]
[13, 11, 7, 14, 17]
[13, 11, 7, 14, 13]
[13, 11, 7, 15, 13]
[13, 11, 7, 15, 24]
[13, 8, 7, 14, 17]
[13, 8, 7, 14, 13]
[13, 8, 7, 15, 13]
[13, 8, 7, 15, 24]
[13, 8, 26, 15, 13]
[13, 8, 26, 15, 24]
[13, 8, 26, 8, 24]
[13, 8, 26, 8, 11]
最大值为: 86
最大值对应的路径为: [13, 8, 26, 15, 24]