【问题标题】:Python math game algorithmPython数学游戏算法
【发布时间】:2018-02-14 03:15:39
【问题描述】:

我有一个列表,其中(随机)包含 5 到 10 个项目。列表中的第一个 int 始终为 0,其他所有的都是随机正数。它可能看起来像这样:

0 10 50 45 80 5 35

该程序的目标是将列表中的项目视为空格,当您移动到下一个项目时,总和会相加。该人从 0 开始,始终可以向右移动一个空格或跳过一个空格并降落在下一个空格上。例如,对于上面的一个,我可以从 0 到 10,或者从 0 到 50 进行第一步。然后我可以从 50 到 45 或从 50 到 80 等等。

我想找出一种递归算法来遍历这些并找到获得总和最低的最后一项的方法。我应该经历所有可能的组合还是有更简单的方法来做到这一点?它是否与检查每回合可能移动的值并选择较低的值有关?

【问题讨论】:

  • 这可能是cs.stackexchange.com 的问题。无论如何,您应该查找有向无环图 (DAG) 的最短路径算法。您可以简单地将您的序列和允许的移动构建为 DAG,并使用任意数量的有据可查的算法。

标签: python algorithm list math


【解决方案1】:

是的,有一种更有效的方法。这个问题看起来非常适合dynamic programming。这个想法是您以相反的方式看待问题:对于每个位置 P,您可能会从前一个位置或从后面两个位置来解决它。因此,要找到位置 P 的最佳路线,您只需要知道位置 (P-1) 的最佳路线> 和 (P-2),然后比较它们。

如果我正确理解了总和计算背后的逻辑,这就是你所需要的:

def solve(values):
    prev1 = 0
    prev2 = 0
    for p in range(len(values)):
        cur = min(prev1, prev2) + values[p]
        prev2 = prev1
        prev1 = cur

    return cur

print(solve([0, 10, 50, 45, 80, 5, 35]))

输出

95

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多