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 mnpSample 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++;
}
Status Compilation Error Length 1087 Lang G++ Submitted 2019-03-31 16:39:02 Shared RemoteRunId 28765235 What do you want to do?