动态编程 - 最常见的子串解释

时间:2015-07-04 12:53:20

标签: c++ dynamic-programming

我是一个试图围绕动态编程的新手,这对我来说似乎是一个谜。我正在研究使用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问题?

1 个答案:

答案 0 :(得分:1)

我建议理解解决方案的一般概念。 以下是一些参考文献,从最简单的解释到更深层的解释:

  1. Wiki - https://en.wikipedia.org/wiki/Longest_common_substring_problem
  2. YouTube - https://www.youtube.com/watch?v=aSwu8Z9nzOg
  3. 以及关于此解决方案的学术参考资料,您将在上面介绍:

    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. Corenell - 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
    4. 然后,在了解了他们的解决方案及解决此问题的方法之后,您将看到您可以自己实现它或完全理解算法中的逻辑

      祝你好运!