请用动态规划算法完成最长公共子序列问题程序,并通过测试
时间: 2023-07-15 15:10:00 浏览: 45
好的,以下是使用动态规划算法求解最长公共子序列问题的 Python 代码:
```python
def lcs(x, y):
m = len(x)
n = len(y)
# 初始化二维数组dp
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])
# 逆推回溯找到最长公共子序列
i, j = m, n
res = []
while i > 0 and j > 0:
if x[i-1] == y[j-1]:
res.append(x[i-1])
i -= 1
j -= 1
elif dp[i-1][j] > dp[i][j-1]:
i -= 1
else:
j -= 1
# 将结果反转,得到最长公共子序列
res.reverse()
return ''.join(res)
```
以上代码中,lcs 函数的输入为两个字符串 x 和 y,输出为它们的最长公共子序列。其中,dp[i][j] 表示 x 的前 i 个字符和 y 的前 j 个字符的最长公共子序列长度。状态转移方程如下:
```
dp[i][j] = dp[i-1][j-1] + 1, if x[i-1] == y[j-1]
dp[i][j] = max(dp[i-1][j], dp[i][j-1]), otherwise
```
根据上述状态转移方程,我们可以计算出整个 dp 数组。然后,我们可以通过逆推回溯的方式,找到最长公共子序列。
接下来,我们使用一些测试用例来验证代码的正确性:
```python
print(lcs('ABCD', 'BD')) # BD
print(lcs('AGGTAB', 'GXTXAYB')) # GTAB
print(lcs('abcdefg', 'xyzabcde')) # abcde
```
以上代码输出结果均与预期一致,说明该算法正确性得到验证。