首页 > 代码库 > nyoj-36-最长公共子序列

nyoj-36-最长公共子序列

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, 0sizeof(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 } 

nyoj-36-最长公共子序列