NYOJ 36 最长公共子序列 (还是dp)

这个好多算法书上都有,不仅限于《算法导论》

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

  • 描写叙述
  • 咱们就不拐弯抹角了,如题。须要你做的就是写一个程序,得出最长公共子序列。

    tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。

    其定义是。一个序列 S ,假设各自是两个或多个已知序列的子序列,且是全部符合此条件序列中最长的。则 S 称为已知序列的最长公共子序列。

    • 输入
    • 第一行给出一个整数N(0<N<100)表示待測数据组数

      接下来每组数据两行,分别为待測的两组字符串。

      每一个字符串长度不大于1000.

    • 输出
    • 每组測试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
    • 例子输入
    • 2
      asdf
      adfsd
      123abc
      abc123abc
    • 例子输出
    • 3
#include<iostream>
#include<cstring>
#include <string>

using namespace std;

int a[1010][1010];

int max(int x, int y)
{
    return x>y ?

x : y;
}

int main()
{
    int test,i,j,k,len1,len2,lcs;
    string s1,s2;
    cin>>test;
    while(test--)
    {
        cin>>s1>>s2;
        len1=s1.length();
        len2=s2.length();
        memset(a,0,sizeof(a));
        lcs=0;
        for(i=1;i<len1+1;i++)
        {
            for(j=1;j<len2+1;j++)
            {
                if(s1[i-1]==s2[j-1])
                    a[i][j]=a[i-1][j-1]+1;
                else
                    a[i][j]=max(a[i][j-1],a[i-1][j]);
                if(a[i][j]>lcs)
                    lcs=a[i][j];
            }
        }
        cout<<lcs<<endl;
    }
    return 0;
}
时间: 2024-10-21 06:35:08

NYOJ 36 最长公共子序列 (还是dp)的相关文章

nyoj 36 最长公共子序列 【DP】

今天听了老师讲的最长公共子序列,就拿以前做过的题又做了一遍... 我用的是最简单普通的方法, 代码: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[1005][1005]; int main() { char a[1005], b[1005]; int t; scanf("%d", &t); while(t --){ s

nyist oj 36 最长公共子序列 (动态规划基础题)

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接

LCS 最长公共子序列(DP经典问题)

最长公共子序列问题以及背包问题都是DP(动态规划)算法的经典题目,值得深度挖掘以致了解DP算法思想.问题如下: 最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最

51nod 1006 最长公共子序列Lcs(dp+string,无标记数组实现)

1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 取消关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列. Input 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) Output 输出最长的子序列,如果有多个,随意输出1个. Input示

hdu 1159 Common Subsequence(最长公共子序列,DP)

题意: 两个字符串,判断最长公共子序列的长度. 思路: 直接看代码,,注意边界处理 代码: char s1[505], s2[505]; int dp[505][505]; int main(){ while(scanf("%s%s",s1,s2)!=EOF){ int l1=strlen(s1); int l2=strlen(s2); mem(dp,0); dp[0][0]=((s1[0]==s2[0])?1:0); rep(i,1,l1-1) if(s1[i]==s2[0]) dp

nyoj36最长公共子序列(dp)

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数接下来

LCS(最长公共子序列)和dp(动态规划)

参照:v_JULY_v 最长公共子序列定义: 注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列:更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必.比如字符串acdfg同akdfc的最长公共子串为df,而他们的最长公共子序列是ad

LCS求最长公共子序列(DP)

动态规划并不是一种算法,而是一种解决问题的思路.典型的动态规划问题,如最长公共子序列(LCS),最长单调子序列(LIS)等. 动态规划分为四个步骤: 1.判断问题是否具有最优子结构 这里以LCS为例,X={x1,x2,...,xi}:Y={y1,y2,...,yj}.最长公共子序列Z={z1,z2,...,zk}: ①如果xi=yj,那么zk=xi=yj,且Zk-1是序列Xi-1和Yj-1的LCS: ②如果xi≠yj,那么zk≠xi:且Zk是序列Xi-1和Yj的LCS: ③如果xi≠yj,那么z

最长公共子序列LCS (DP)

题意: 求两个字符串的公共子序列,如"abcd" 与 "becd"的公共子序列是 "bcd" 分析: 设两个字符串为 串s 和串tdp[i][j]:= s1..si和t1...tj对应的LCS长度 那么 dp[i][j] = { 0                     ,   i =0 or j = 0; dp[i-1][j-1] + 1,   i ,j > 0 and si = tj; max(dp[i-1][j] , dp[i][j