动态规划(Dynamic Programming)是解决最长公共子序列(Longest Common Subsequence,LCS)问题的经典方法之一。LCS 是指在两个序列中找到的最长的公共子序列的长度,不要求子序列在原序列中是连续的。动态规划方法可以有效地解决这一问题,下面是一个使用动态规划计算 LCS 的示例 Python 代码:
```python
def lcs_dp(X, Y):
m = len(X)
n = len(Y)
创建一个二维数组用于保存子问题的解
dp = [[0] * (n 1) for _ in range(m 1)]
填充 dp 数组
for i in range(1, m 1):
for j in range(1, n 1):
if X[i 1] == Y[j 1]:
dp[i][j] = dp[i 1][j 1] 1
else:
dp[i][j] = max(dp[i 1][j], dp[i][j 1])
构造最长公共子序列
lcs_length = dp[m][n]
lcs = [''] * lcs_length
i, j = m, n
while i > 0 and j > 0:
if X[i 1] == Y[j 1]:
lcs[lcs_length 1] = X[i 1]
i = 1
j = 1
lcs_length = 1
elif dp[i 1][j] >= dp[i][j 1]:
i = 1
else:
j = 1
return ''.join(lcs)
示例用法
X = "ABCBDAB"
Y = "BDCAB"
result = lcs_dp(X, Y)
print("最长公共子序列为:", result)
```
这段代码中,`lcs_dp` 函数使用一个二维数组 `dp` 来保存子问题的解。`dp[i][j]` 表示 `X[0:i]` 和 `Y[0:j]` 的最长公共子序列的长度。算法首先填充 `dp` 数组,然后根据 `dp` 数组的内容反向构造出最长公共子序列。
文章已关闭评论!
2024-11-26 12:29:41
2024-11-26 12:28:27
2024-11-26 12:27:14
2024-11-26 12:25:56
2024-11-26 12:24:32
2024-11-26 12:23:18
2024-11-26 12:21:55
2024-11-26 12:20:36