问题
给定序列
X=<x_1,x_2,…,x_m>
Y=<y_1,y_2,…,y_j>
求X和Y的最长公共子序列(LCS)
解析
用动态规划解决最长公共子序列问题。
设dp[i][j]表示字符串S1前i位与字符串S2前j位的LCS,则dp[n][m]即为答案。
具体遍历过程如下表:S1:2345678,S2:135789
设计
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long ll;
char s1[1010], s2[1010];
int n, m, dp[1010][1010];
int main() {
scanf("%s", s1 + 1);
scanf("%s", s2 + 1);
n = strlen(s1 + 1), m = strlen(s2 + 1);
for (int i = 0; i <= n; i++) dp[i][0] = 0;
for (int j = 0; j <= m; j++) dp[0][j] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (s1[i] == s2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
printf("%d", dp[n][m]);
}
分析
主要时间复杂度在主函数dp遍历的两重循环中,所以时间复杂度为: