I'm practicing Dynamic Programming and I am writing the Longest Increasing Subsequence problem.
I have the DP solution:
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)]
And a non-memoized version
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
However, the two functions have different behaviours. For example, the test case longest_subsequence([10,9,2,5,3,7,101,18])
fails for the memoized version.
>>> longest_subsequence([10,9,2,5,3,7,101,18])
[10, 101]
The non-memoized version is fully correct however (although much slower).
>>> longest_subsequence([10,9,2,5,3,7,101,18])
[2, 5, 7, 101]
what I am doing wrong?