我试图通过已完成的DP表进行回溯跟踪。假设表格正确填写了正确的值。如果有人愿意,我可以发布表格的片段。 但是这里是我的代码片段,它从backtrace生成字符串
{{1}}
我的逻辑是,它总是通过表格查找并找到最小的值,试图回到表格的0部分的成本。在哪个i& j应该为0并且循环退出。关于NW算法的特殊之处在于间隙,删除,交换的值可以是他们想要的任何数字,而不仅仅是-1,0等
根据检查后跟踪的脚本,我错了。虽然我知道我正在填写表格,因为另一个测试脚本确认了这一点。
答案 0 :(得分:1)
如果不同操作的成本不同,那么填写数组的代码将类似于:
minCost = min(array[i - 1][j]+C0, array[i][j - 1]+C1, array[i - 1][j- 1]+C2)
其中C0,C1,C2是不同的成本。
在这种情况下,回溯代码还需要将这些成本合并如下:
if (minCost == array[i - 1][j - 1]+C2):
StringA += xLine[i - 1]
StringB += yLine[j - 1]
array[i - 1][j - 1] = 0
i -= 1
j -= 1
elif (minCost == array[i][j - 1]+C1):
StringA += '-'
StringB += yLine[j - 1]
array[i][j - 1] = 0
j -= 1
elif (minCost == array[i - 1][j]+C0):
StringA += xLine[i - 1]
StringB += '-'
array[i - 1][j]= 0
i -= 1
仔细检查算法的一种方法是计算回溯步骤的实际成本。在您当前的实现中,我预计回溯成本会高于您计算的成本(因为回溯忽略了成本)。
答案 1 :(得分:1)
想出来,没有考虑从一个细胞到另一个细胞的移动成本
解决方案:
def stringBuilder(array, costBook, xLine, yLine):
StringA, StringB = "", ""
i, j = len(xLine), len(yLine)
totalCost = array[i][j]
while (i != 0 or j != 0):
if (array[i][j] == array[i][j - 1] + int(costBook['-' + yLine[j - 1]])):
StringA += '-'
StringB += yLine[j - 1]
array[i][j] = 0
j -= 1
elif (array[i][j] == array[i - 1][j] + int(costBook[xLine[i - 1] + '-'])):
StringA += xLine[i - 1]
StringB += '-'
array[i][j] = 0
i -= 1
elif (array[i][j] == array[i - 1][j - 1] + int(costBook[xLine[i - 1] + yLine[j - 1]])):
StringA += xLine[i - 1]
StringB += yLine[j - 1]
array[i][j] = 0
i -= 1
j -= 1