Longest Common Subsequence _dp

本文介绍了一种求解两个序列最长公共子序列(LCS)长度的方法,并提供了一个具体的程序实现示例。通过动态规划算法高效地解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

For given two sequences X and Y, a sequence Z is a common subsequence of X and Y if Z is a subsequence of both X and Y. For example, if X={a,b,c,b,d,a,b} and Y={b,d,c,a,b,a}, the sequence {b,c,a} is a common subsequence of both X and Y. On the other hand, the sequence {b,c,a} is not a longest common subsequence (LCS) of X and Y, since it has length 3 and the sequence {b,c,b,a}, which is also common to both X and Y, has length 4. The sequence {b,c,b,a} is an LCS of X and Y

, since there is no common subsequence of length 5 or greater.

Write a program which finds the length of LCS of given two sequences X

and Y

. The sequence consists of alphabetical characters.

Input

The input consists of multiple datasets. In the first line, an integer q

which is the number of datasets is given. In the following 2×q lines, each dataset which consists of the two sequences X and Y

are given.

Output

For each dataset, print the length of LCS of X

and Y

in a line.

Constraints

  • 1q150

1 length of X and Y 1,000
q20
  • if the dataset includes a sequence whose length is more than 100

Sample Input 1

3
abcbdab
bdcaba
abc
abc
abc
bc

Sample Output 1

4
3
2

Reference

Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.

#include<bits/stdc++.h>

using namespace std;

const int N(1050);
char s[N],t[N];
int c[N][N];


int main(){
    //freopen("in.txt","r",stdin);
    int z;
    cin>>z;
    while(z--){
        scanf("%s%s",s,t);
        int n=strlen(s);
        int m=strlen(t);
        memset(c,0,sizeof(c));
        int mm=0;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            if(s[i-1]==t[j-1])
            c[i][j]=c[i-1][j-1]+1;
            else c[i][j]=max(c[i-1][j],c[i][j-1]);
            mm=max(c[i][j],mm);
        }
        cout<<mm<<endl;
    }
    //fclose(stdin);
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值