http://acm.nyist.net/JudgeOnline/problem.php?pid=36
最长公共子序列
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
- 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。 - 输入
- 第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000. - 输出
- 每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
- 样例输入
2 asdf adfsd 123abc abc123abc
- 样例输出
3 6
解题思路:求最长公共子序列,经典DP,详情请看代码=-=
1 #include <iostream>
2 #include <algorithm>
3 #include <stdlib.h>
4 #include <math.h>
5 #include <string.h>
6
7 using namespace std;
8
9 const int MAXN = 1010;
10
11 //输入
12 char s[MAXN], t[MAXN];
13 //dp数组
14 int dp[MAXN][MAXN];
15
16 void solve(){
17 int n, m;
18 n = strlen(s);
19 m = strlen(t);
20 memset(dp, 0, sizeof(dp));
21 for(int i = 0; i < n; i++){
22 for(int j = 0; j < m; j++){
23 if(s[i] == t[j]){
24 dp[i + 1][j + 1] = dp[i][j] + 1;
25 }
26 else{
27 dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1]);
28 }
29 }
30 }
31 cout << dp[n][m] << endl;
32 }
33
34 int main(){
35 int T;
36 cin >> T;
37 while(T--){
38 cin >> s >> t;
39 solve();
40 }
41 return 0;
2 #include <algorithm>
3 #include <stdlib.h>
4 #include <math.h>
5 #include <string.h>
6
7 using namespace std;
8
9 const int MAXN = 1010;
10
11 //输入
12 char s[MAXN], t[MAXN];
13 //dp数组
14 int dp[MAXN][MAXN];
15
16 void solve(){
17 int n, m;
18 n = strlen(s);
19 m = strlen(t);
20 memset(dp, 0, sizeof(dp));
21 for(int i = 0; i < n; i++){
22 for(int j = 0; j < m; j++){
23 if(s[i] == t[j]){
24 dp[i + 1][j + 1] = dp[i][j] + 1;
25 }
26 else{
27 dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1]);
28 }
29 }
30 }
31 cout << dp[n][m] << endl;
32 }
33
34 int main(){
35 int T;
36 cin >> T;
37 while(T--){
38 cin >> s >> t;
39 solve();
40 }
41 return 0;
42 }