【发布时间】:2017-02-20 22:54:54
【问题描述】:
我正在练习动态编程,正在编写最长递增子序列问题。
我有 DP 解决方案:
def longest_subsequence(lst, lis=[], mem={}):
if not lst:
return lis
if tuple(lst) not in mem.keys():
if not lis or lst[0] > lis[-1]:
mem[tuple(lst)] = max([longest_subsequence(lst[1:], lis+[lst[0]], mem), longest_subsequence(lst[1:], lis, mem)], key=len)
else:
mem[tuple(lst)] = longest_subsequence(lst[1:], lis, mem)
return mem[tuple(lst)]
还有一个非记忆版本
def longest_subsequence(lst, lis=[]):
if not lst:
return lis
if not lis or lst[0] > lis[-1]:
result = max([longest_subsequence(lst[1:], lis+[lst[0]]), longest_subsequence(lst[1:], lis)], key=len)
else:
result = longest_subsequence(lst[1:], lis)
return result
但是,这两个函数具有不同的行为。例如,测试用例longest_subsequence([10,9,2,5,3,7,101,18]) 对于记忆版本失败。
>>> longest_subsequence([10,9,2,5,3,7,101,18])
[10, 101]
然而,非记忆版本是完全正确的(虽然慢得多)。
>>> longest_subsequence([10,9,2,5,3,7,101,18])
[2, 5, 7, 101]
我做错了什么?
【问题讨论】:
-
我只是粗略地看了一下你的代码,但你之前有没有在解释器会话中调用过记忆化的版本?可变的默认参数保留状态。这可能会搞砸你。
-
不!这两个结果都来自新的会议@juanpa.arrivillaga
标签: python algorithm dynamic-programming memoization