• dp-最长公共子序列


    最长公共子序列(NYOJ36)

    时间限制: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基础题目。用一个二维数组 dp[i][j] 存放每次状态的最长公共子序列长度,数组下标i,j是当前已经比较的两个字符串长度。两个字符串 s1s2s3s4...si 和 t1t2t3t4...tj ,每比较一个字符,都可能会使最长公共子序列的长度变大。

    s1s2s3s4...si s(i+1)和t1t2t3t4...tj t (j+1)的公共子序列可能是:

    (1) s1s2s3s4...si 和 t1t2t3t4...tj末尾加上一个相同的字符,即s(i+1)=t (j+1)

    (2) s1s2s3s4...si 和 t1t2t3t4...tj t (j+1)的公共子序列

    (3) s1s2s3s4...si s(i+1) 和 t1t2t3t4...tj 的公共子序列

    由此可以推出公式

    dp[i+1][j+1]=max( dp[i+1][j],dp[i][j+1] );

    dp[i+1][j+1]=dp[i][j]+1;

    AC代码:

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    char s1[1005],s2[1005];
    int dp[1005][1005];
    int len1,len2;
    
    int main()
    {
        int t;
        scanf("%d",&t);
        getchar();
        while(t--)
        {
            memset(dp,0,sizeof(dp));///每次都要清0
            gets(s1);
            gets(s2);
            len1=strlen(s1);
            len2=strlen(s2);
            for(int i=0;i<len1;i++)
            {
                for(int j=0;j<len2;j++)
                {
                    if(s1[i]==s2[j])
                        dp[i+1][j+1]=dp[i][j]+1;///当i=j=0并且字符相等时,dp[1][1]中的1代表两个字符串比较的字符个数
                    else
                        dp[i+1][j+1]=max( dp[i+1][j],dp[i][j+1] );
                }
            }
            printf("%d
    ",dp[len1][len2]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    PHP字符串操作
    设置WINDOWS SERVER 2008修改远程桌面连接数
    ThinkPHP小知识点
    thinkphp5 url传参
    炫酷:一句代码实现标题栏、导航栏滑动隐藏。ByeBurger库的使用和实现
    数学API Math.atan() 和Math.atan2() 三角函数复习
    自定义view实现水波纹效果
    Android仅2步实现 滚粗 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)
    安卓开发遇到Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
    在安卓代码中dp 和 sp 换算px
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/9902806.html
Copyright © 2020-2023  润新知