• 【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
    ",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
    ",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
    ",dp[len1][len2]);
    29     }
    30     return 0;
    31 }
  • 相关阅读:
    Python3-2020-测试开发-7- 元组tuple
    Python3-2020-测试开发-6- 列表list
    面向对象三大特性之多态、封装代码注释部分
    抽象类和接口类代码注释部分
    面向对象三大特性:继承,多态,封装之继承代码注释部分
    面向对象之类的组合代码注释部分
    面对想三大特性之多态,封装
    面向对象三大特性:继承,多态,封装之继承
    类与对象的命名空间
    面向对象和类
  • 原文地址:https://www.cnblogs.com/zhengbin/p/4456888.html
Copyright © 2020-2023  润新知