Python数字金字塔

题目

如下图,从上往下找一条路径,使得这条路径上数字的和达到最大。从当前节点往下,只能选择该节点的左分支或右分支,比如从第一层的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]

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值