我是一个试图围绕动态编程的新手,这对我来说似乎是一个谜。我正在研究使用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问题?
答案 0 :(得分:1)
我建议理解解决方案的一般概念。 以下是一些参考文献,从最简单的解释到更深层的解释:
以及关于此解决方案的学术参考资料,您将在上面介绍:
然后,在了解了他们的解决方案及解决此问题的方法之后,您将看到您可以自己实现它或完全理解算法中的逻辑
祝你好运!