欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Common Subsequence 动规小练

程序员文章站 2022-07-16 11:26:45
...

Common Subsequence
原题链接https://vjudge.net/contest/349774#problem/F
Common Subsequence 动规小练
Common Subsequence 动规小练
对于题目可以理解为一个表格来理解
附一个较好的题解链接,它所画的表格很有助于理解该题
当两个字母相同时就要去找这两个数都没出现过时的最大情况也就是[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;
}
相关标签: 动规小练