【问题标题】:Tabulation vs Memoization for Backtracking solutions in Dynamic Programming (ex LCS)动态规划中回溯解决方案的制表与记忆(前 LCS)
【发布时间】:2020-05-20 18:54:15
【问题描述】:

假设我们使用记忆化(自上而下的方法)或制表法(自下而上)的动态规划来解决两个字符串之间的最长公共子序列问题。

我的问题是,可以更改这两种方法中的哪一种以另外返回最长的公共字符串(超出其长度)? 我的意思是:

str1 = ‘abcdefg’
str2 = ‘@bcd@f@@‘

x = LCS(str1, str2)
y = LCS_altered(str1, str2)

# x = 4
# y = (4, ‘bcdf’) or (4, [False, True, True, True, False, True, False, False])

这两种方法都可以改变来实现这一点还是取决于问题?

[编辑]
我的直觉是,记忆方法可以“轻松”更改,以便跟踪实际解决方案。但是,鉴于制表方法中的“表格内容”,我看不到一种简单的方法(或一般方法)来回溯解决方案。请尽可能笼统地回答(不是专门针对 LCS 问题)。

【问题讨论】:

  • 悬赏是你的选择,但我不明白为什么。这个问题没有什么新鲜的。查看著名的 LCS 算法将完全回答您的问题(包括更一般的情况)。

标签: dynamic-programming backtracking memoization topdown bottom-up


【解决方案1】:

这两种方法中的哪一种可以改变,以便另外 返回最长的公共字符串(超出其长度)

两者都可以,

是否可以改变这两种方法来实现这一点...

是的,

...还是取决于问题?

没有。

如果您自己实施 LCS,那么添加它是微不足道的。首先找到 LCS 要困难得多。至于到底是用memoization好还是用制表好,请看这个回答https://stackoverflow.com/a/6185005/11729048

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多