我正在研究一些代码来计算给定2D数组中代表三角形的最短路径。这是使用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])
给出这个2D数组
['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]
答案 0 :(得分:1)
您的三角形包含字符串而不是整数。为了解决这个问题,我们需要在对它们执行任何操作之前将所有字符串强制转换为int
,否则+
操作将会连续,<
比较运算符将对字符串进行字典比较
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
,您会在output[x]
的每次迭代中更改for y in range(0 , x)
的值。所以基本上发生的事情是你没有跟踪你的最佳答案,你只是覆盖它。
您想要为动态编程解决方案做的是从下到上填写每个元素到底部的最小距离和相关路径。那么你最终应该在三角形的顶部找到解决方案。