AOJ_ALDS1_10_C Longest Common Subsequence【LCS+DP】

Longest Common Subsequence
Aizu - ALDS1_10_C

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 qq 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

1≤q≤150
1≤ length of X and Y ≤1,000
q≤20 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.

问题链接AOJ_ALDS1_10_C Longest Common Subsequence
问题简述:(略)
问题分析
    动态规划问题,是一个标准模板题,套模板就可以了。
    需要注意字符串长度!
程序说明:(略)
    该程序使用C++语言编写,使用了string变量,并且把LCS算法封装到函数lcs()中。
题记:(略)
参考链接POJ1458 HDU1159 ZOJ1733 UVALive2759 Common Subsequence【最长公共子序列+DP】

AC的C++语言程序如下:

/* AOJ_ALDS1_10_C Longest Common Subsequence */

#include <iostream>
#include <string.h>

using namespace std;

const int N = 1000;

int lcs(string& a, string& b)
{
    int dp[N + 1][N + 1];
    memset(dp, 0, sizeof(dp));
    for(int i = 0; i < (int)a.size(); i++)
        for(int j = 0; j < (int)b.size(); j++)
            if(a[i] == b[j])
                dp[i + 1][j + 1] = dp[i][j] + 1;
            else
                dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);

    return dp[a.size()][b.size()];
}

int main()
{
    string s1, s2;
    int q;

    cin >> q;
    for(int i = 1; i <= q; i++) {
        cin >> s1 >> s2;
        cout << lcs(s1, s2) << endl;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值