笑死我了哈哈哈哈Common Subsequence HDU - 1159(什么!?动态规划经典题目这么容易看懂?!!!!)

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.

Input

The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

Output

For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.

Sample Input

abcfbc         abfcab
programming    contest 
abcd           mnp

Sample Output

4
2
0

 

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char a[2119],b[2119];///存放两个组串的数组
///哈哈哈哈哈xswl我把数组开的超级大,它问我what do you want to do???
int dp[2119][2119],i,j;
int main()///二维动规数组,dp[i][j]表示a的i位和b的j位之前的公共序列长度
{
    ///任务:找到最长公共子序列
    while(cin>>a+1>>b+1)
    {
        ///使用方便和理解,从下标为1读入
        int lena=strlen(a+1),lenb=strlen(b+1);///长度也是从1开始
        for(i=j=0; i<=lena,j<=lenb; i++,j++)
        {///动规边界
            dp[i][0]=0;
            ///单个字符时公共序列长度为0
            dp[0][j]=0;
        }///a的每一位到
        for(i=1; i<=lena; i++)
        {
            for(j=1; j<=lenb; j++)
            {
                if(a[i]==b[j])///匹配成功
                ///前面的公共序列dp[i-1][j-1]变长一位
                    dp[i][j]=dp[i-1][j-1]+1;
                else///字符不相等,无法延长,需要选择继承前面的较大序列
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            ///两个字符串的分别前一个字符串的公共序列最大者
            }
        }///输出结果为两个字符串从头到尾匹配完毕得到的公共长度
        cout<<dp[lena][lenb]<<endl;
    }
}
inline char gc()
{
    static char buff[100000000],*S=buff,*T=buff;
    return S==T&&(T=(S=buff)+fread(buff,1,100000000,stdin),S==T)?EOF:*S++;
}
StatusCompilation Error
Length1087
LangG++
Submitted2019-03-31 16:39:02
Shared 
RemoteRunId28765235
What do you want to do?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值