Common Subsequence
原题链接https://vjudge.net/contest/349774#problem/F
对于题目可以理解为一个表格来理解
附一个较好的题解链接,它所画的表格很有助于理解该题
当两个字母相同时就要去找这两个数都没出现过时的最大情况也就是[i-1][j-1];
当两个字母不同时要继承最大的情况,最后得出一个最长的子序列
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
long long dp[10005][10005];
int main()
{
char s1[10005];
char s2[10005];
while(~scanf("%s %s",s1,s2))
{
long long n1=strlen(s1);
long long n2=strlen(s2);
long long i,j;
for(i=0; i<=n1; i++)
{
for(j=0; j<=n2; j++)
{
if(i==0||j==0)//对于只有一个有字母或者两个都没有字母的情况,显然为0;
{
dp[i][j]=0;
}
else
{
if(s1[i-1]==s2[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;//继承最长的不包含相等的俩个字母的序列,并+1
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//继承最长的链
}
}
}
}
printf("%lld\n",dp[n1][n2]);
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
}
return 0;
}