【问题标题】:Dynamic programming- Longest common substring explanation动态规划——最长公共子串解释
【发布时间】:2015-07-04 12:53:20
【问题描述】:

我是一个新手,试图将我的头脑包裹在动态编程上,这对我来说似乎是一个谜。我正在查看使用 DP 的最长常见子字符串问题的解决方案。它的代码如下:-

int dp[N+1][N+1];

for (int i = 0; i <= N; ++i)

  dp[0][i] = dp[i][0] = 0;

for (int i = 1; i <= N; ++i)

  for (int j = 1; j <= N; ++j) {

    dp[i][j] = max(dp[i-1][j], dp[i][j-1]);

    if (A[i-1] == B[j-1])

      dp[i][j] = max(dp[i][j], dp[i-1][j-1]+1);

  }


int answer = dp[N][N];

它的解决方案看起来很简单,但我很难理解解决方案。谁能解释一下代码中发生了什么以及这如何解决 LCS 问题?

【问题讨论】:

标签: c++ dynamic-programming


【解决方案1】:

我建议您了解解决方案的总体思路。 以下是一些参考资料,从最简单的解释到更深入的解释:

  1. 维基 - https://en.wikipedia.org/wiki/Longest_common_substring_problem
  2. YouTube - https://www.youtube.com/watch?v=aSwu8Z9nzOg

以及您在上面介绍的有关此解决方案的学术参考:

  1. 麻省理工学院-http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/video-lectures/lecture-15-dynamic-programming-longest-common-subsequence/lec15.pdf
  2. 科内尔 - http://www.cs.cornell.edu/~wdtseng/icpc/notes/dp2.pdf
  3. CMU - http://www.cs.cmu.edu/afs/cs/academic/class/15451-f10/www/lectures/lect0928.pdf

那么,在了解了他们的解决方案和他们解决这个问题的方法之后,你会发现你可以自己实现它,或者完全理解你的算法中的逻辑

祝你好运!

【讨论】:

  • 非常感谢您提供宝贵的链接。
猜你喜欢
  • 1970-01-01
  • 2016-05-02
  • 2016-08-12
  • 2014-04-14
  • 1970-01-01
  • 2017-04-26
  • 2016-06-03
  • 2010-11-28
  • 2015-05-17
相关资源
最近更新 更多