动态规划策略实现最长公共子序列。 最长公共子序列问题:对两个类型相同的序列(输入),用动态规划方法计算他们的最长公共子序列,并输出最长公共子序列的长度值。java
时间: 2023-08-25 11:24:37 浏览: 103
利用动态规划算法解决最长公共子序列问题.doc
好的,下面是Java代码实现最长公共子序列问题的动态规划算法:
```java
public static int longestCommonSubsequence(String A, String B) {
int m = A.length(), n = B.length();
int[][] dp = new int[m+1][n+1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (A.charAt(i-1) == B.charAt(j-1)) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[m][n];
}
```
其中,dp[i][j]表示A的前i个字符和B的前j个字符的最长公共子序列的长度。初始化时,当i=0或j=0时,dp[i][j]都为0。状态转移方程如下:
当A[i-1]==B[j-1]时,dp[i][j] = dp[i-1][j-1] + 1,表示当前字符相同,最长公共子序列长度加1;
当A[i-1]!=B[j-1]时,dp[i][j] = max(dp[i-1][j], dp[i][j-1]),表示当前字符不同,需要在A的前i-1个字符和B的前j个字符中找到最长公共子序列,或者在A的前i个字符和B的前j-1个字符中找到最长公共子序列,取两者中的最大值。
最终返回dp[m][n]即为A和B的最长公共子序列的长度。
阅读全文