动态规划--最长公共子序列问题
时间: 2023-10-02 09:05:50 浏览: 113
最长公共子序列问题是指给定两个序列,找出它们之间最长的公共子序列。
动态规划的思路是将原问题分解成若干个子问题,先解决子问题,最后合并成原问题的解。对于最长公共子序列问题,我们可以将两个序列分别以行和列的方式表示在一个二维矩阵中,然后利用动态规划的思想求解。
具体来说,我们定义一个二维数组dp,其中dp[i][j]表示序列1的前i个元素和序列2的前j个元素的最长公共子序列的长度。则dp[i][j]有以下两种情况:
1. 如果序列1的第i个元素和序列2的第j个元素相同,则dp[i][j] = dp[i-1][j-1] + 1;
2. 如果序列1的第i个元素和序列2的第j个元素不同,则dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
最终的最长公共子序列的长度即为dp[m][n],其中m和n分别为两个序列的长度。
下面是用Python实现最长公共子序列问题的代码:
def lcs(s1, s2):
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i - 1] == s2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
return dp[m][n]
阅读全文