【发布时间】:2016-02-18 21:13:28
【问题描述】:
两周前,我在这里发布了THIS 关于动态编程的问题。用户Andrea Corbellini 准确地回答了我想要的,但我想更进一步地解决这个问题。
这是我的功能
def Opt(n):
if len(n) == 1:
return 0
else:
return sum(n) + min(Opt(n[:i]) + Opt(n[i:])
for i in range(1, len(n)))
假设你会打电话
Opt( [ 1,2,3,4,5 ] )
上一个问题解决了计算最优值的问题。现在, 而不是为上面的例子计算最优值 33,我想打印我们得到最优解的方式(最优解的路径)。所以,我想打印列表被剪切/划分的索引,以列表的形式获得最佳解决方案。所以,上面例子的答案是:
[ 3,2,1,4 ](在第三个标记/索引处切割极点/列表,然后在第二个索引之后,然后在第一个索引之后,最后在第四个索引处)。
那就是答案应该是列表的形式。列表的第一个元素将是列表的第一次切割/分割应该在最佳路径中发生的索引。第二个元素将是列表的第二个切割/除法,依此类推。
也可以有不同的解决方案:
[ 3,4,2,1 ]
它们仍然会引导您获得正确的输出。因此,您打印哪一个并不重要。但是,我不知道如何跟踪和打印动态编程解决方案所采用的最佳路径。 顺便说一句,我想出了一个非递归的解决方案来解决我之前的问题中解决的问题。但是,我仍然无法确定打印最佳解决方案的路径。这是上一个问题的非递归代码,可能有助于解决当前问题。
def Opt(numbers):
prefix = [0]
for i in range(1,len(numbers)+1):
prefix.append(prefix[i-1]+numbers[i-1])
results = [[]]
for i in range(0,len(numbers)):
results[0].append(0)
for i in range(1,len(numbers)):
results.append([])
for j in range(0,len(numbers)):
results[i].append([])
for i in range(2,len(numbers)+1): # for all lenghts (of by 1)
for j in range(0,len(numbers)-i+1): # for all beginning
results[i-1][j] = results[0][j]+results[i-2][j+1]+prefix[j+i]-prefix[j]
for k in range(1,i-1): # for all splits
if results[k][j]+results[i-2-k][j+k+1]+prefix[j+i]-prefix[j] < results[i-1][j]:
results[i-1][j] = results[k][j]+results[i-2-k][j+k+1]+prefix[j+i]-prefix[j]
return results[len(numbers)-1][0]
【问题讨论】:
-
这就像一篇博文。你有什么问题?
-
值得一提的是,找到动态规划解决方案的“路径”比仅仅找到解决方案要困难得多。
-
@cat 如何按照我的解释更改算法的输出
-
@TheTask1337 您的“问题”不仅隐藏在不必要的文字墙中,无法帮助我理解为什么要阅读此内容,而且问题陈述本身对于本地人来说几乎是不可理解的扬声器。请尝试准确指出您需要帮助的内容,并进行解释,以便不经意的观察者可以了解发生了什么。
-
@cat 管理员重新整理了我的问题后,可能会更清楚。不过谢谢。
标签: python dynamic-programming memoization