Fork me on GitHub

【LCS,LIS】最长公共子序列、单调递增最长子序列

单调递增最长子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
 
描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
 
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg
样例输出
1
3
7
【分析】
【代码】
 1 #include <cstdio>
 2 #include <cstring>
 3 const int maxn=10001;
 4 char s[maxn];
 5 int dp[maxn],Max;
 6 void LICS()
 7 {
 8     int len,i,j;
 9     memset(dp,0,sizeof(dp));
10     len=strlen(s);
11     for(i=0;i<len;i++)
12     {
13         dp[i]=1;//给定一个数组求的时候,初始值就是1,一个数组的最大序列肯定会有一个字符;
14         for(j=0;j<i;j++)
15         {
16             if(s[i]>s[j] && dp[i]<1+dp[j])// 递推公式,如果这个位置比前面的字符都大,就加入到递增序列中来
17                 dp[i]=1+dp[j];
18         }
19     }
20     Max=0;
21     for(i=0;i<len;i++)//求出最大值
22         if(Max<dp[i])
23           Max=dp[i];
24 }
25 int main()
26 {
27     int t;
28     scanf("%d",&t);
29     while(t--)
30     {
31         scanf("%s",s);
32         LICS();
33         printf("%d\n",Max);
34     }
35     return 0;
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
【分析】
【代码】
 1 //LCS 最长公共子序列
 2 #include<cstdio>
 3 #include<cstring>
 4 #define max(a,b) a > b ? a: b
 5 //using namespace std;
 6 const int maxn = 1001;
 7 int dp[maxn][maxn];
 8 char s1[maxn],s2[maxn];
 9 int main(){
10     int n;
11     int len1,len2;
12     scanf("%d",&n);
13     while(n--){
14         memset(dp,0,sizeof(dp));
15         scanf("%s%s",s1,s2);
16         len1 = strlen(s1);    
17         len2 = strlen(s2);
18         printf("%d %d\n",len1,len2);
19         for(int i = 1;i <= len1;i++){
20             for(int j = 1;j <= len2;j++){
21                 if(s1[i - 1] == s2[j - 1])
22                     //递推公式
23                     dp[i][j] = dp[i - 1][j - 1] + 1;
24                 else 
25                     dp[i][j] = max(dp[i][j - 1],dp[i - 1][j]);
26             }
27         }
28         printf("%d\n",dp[len1][len2]);
29     }
30     return 0;
31 }

 

posted @ 2015-04-25 22:33  郑斌blog  阅读(800)  评论(0编辑  收藏  举报