【问题标题】:Python DP min cost path of a triangle of ints整数三角形的 Python DP 最小成本路径
【发布时间】:2018-01-25 04:33:16
【问题描述】:

我正在编写一些代码来计算给定二维数组中表示三角形的最短路径。这是使用DP来获得解决方案,它需要输出路径而不是最终成本。我知道它正在填充数组自下而上的样式,但是一旦输出正确的成本,我将实施回溯。

这是我目前拥有的代码。出于某种原因,它只是将数字连接起来,而不是像添加字符串那样将其拆分。

with open("small_triangle.txt") as textFile:
    perm = [line.split() for line in textFile]

output = [None] * len(perm)
lines = perm

for j in range(len(lines)):
    print(lines[j])
output[0] = lines[0][0]

for x in range(len(lines)-2, 0, -1):
    for y in range(0 , x):

        if(lines[x+1][y] < lines[x+1][y+1]):
            output[x] = lines[x+1][y]
            lines[x][y] += lines[x+1][y]
        else:
            output[x] = lines[x+1][y+1]
            lines[x][y] += lines[x+1][y+1]

print(output)
#for i in range(len(output)):
#   print("\n"+output[i])

给定这个二维数组

['79']
['82', '04']
['86', '93', '64']
['34', '30', '17', '44']
['41', '79', '83', '33', '86']
['10', '34', '55', '92', '26', '23']
['54', '84', '30', '79', '40', '30', '65']
['94', '64', '79', '36', '79', '78', '72', '36']
['12', '88', '25', '57', '72', '37', '37', '45', '26']
['92', '24', '07', '07', '04', '48', '25', '60', '54', '72']

这是它输出的数组

['79', '8630793430365704', '17332630723725', '332630723725', '2630723725', '30723725', '723725', '3725', '54', None]

【问题讨论】:

  • 您在“三角形”中的值是字符串,您需要将它们全部转换为 int 否则加法 (+) 将连接字符串而不是添加整数。
  • 当我这样做时,例如int(arr elm) 我得到cannot call this function on ints,还有其他方法可以做到这一点。我更精通 Java,所以这有点令人困惑,谢谢!
  • 你能举个例子说明你是如何尝试转换为 int 的吗?
  • 在我正在做的 for 循环中,output[x] = int(lines[x+1][y]) 只是为了测试它,它仍然输出相同的连接输出。没有错误,虽然有点混乱
  • 您需要在任何操作之前强制转换为 int,请参阅下面的答案。

标签: python arrays python-3.x dynamic-programming


【解决方案1】:

您的三角形包含字符串而不是整数。为了解决这个问题,我们需要在对它们进行任何操作之前将所有这些字符串转换为 int,否则 + 操作将连接,&lt; 比较运算符将对字符串进行字典比较。

with open("small_triangle.txt") as textFile:
    perm = [[int(x) for x in line.split()] for line in textFile]

虽然,您的算法是错误的。我不会为您解决所有问题,但我可以指出主要错误。看看你的循环

for x in range(len(lines)-2, 0, -1):
    for y in range(0 , x):

        if(lines[x+1][y] < lines[x+1][y+1]):
            # On every iteration that overwrites output[x]
            output[x] = lines[x+1][y]
            lines[x][y] += lines[x+1][y]
        else:
            # On every iteration that overwrites output[x]
            output[x] = lines[x+1][y+1]
            lines[x][y] += lines[x+1][y+1]

请注意,对于给定的x,您会在每次迭代for y in range(0 , x) 时更改output[x] 的值。所以基本上发生的事情是你没有跟踪你的最佳答案是什么,你只是在覆盖它。

对于动态规划解决方案,您要做的是从下到上填写每个元素到底部的最小距离和相关路径。然后你应该在三角形的顶部得到一个解决方案。

【讨论】:

  • 由于某种原因它仍然输出如下[79, 321, 240, 223, 190, 164, 134, 62, 54, None] 240,223,190 不在三角形中,所以仍然存在一些串联
  • 你的算法不正确,我马上修改
  • 在这里,我指出了主要错误是什么,但我不能再做,因为这需要大量的工作,而且可能是一项任务。
  • 这是对我正在研究的 leetcode 的挑战,但感谢您的帮助
  • 如果是挑战,祝你好运。自己动手是最好的学习方式!
猜你喜欢
  • 2015-06-18
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多