比如输入

abcfbc abfcab

programming contest

adfgs jyt

输出

4

2

0

思路:采用动态规划,一般是先确定动态的状态数组,然后找边界的条件,一般边界都是可以求出来的,

然后再找不是边界的和边界之间的关系

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm> 
using namespace std;
int maxlen[100][100];//定义一个存放状态的数组
char a[100],b[100];
int main()
{
    cin>>a>>b;
    int len1=strlen(a);
    int len2=strlen(b);
    for(int i=1;i<=len1;i++)
    {
    	maxlen[i][0]=0;//如果第二个字符串没有,就是0
	}
	for(int j=1;j<=len2;j++)
       {
    	maxlen[0][j]=0;//如果第一个字符串没有,就是0
	}
	//先找边界条件
	for(int i=1;i<=len1;i++)
	{
		for(int j=1;j<=len2;j++)
		{
			if(a[i-1]==b[j-1])//如果向前找到有相同的字符,那么一定符合前i-1,j-1的情况加1
//这样就找到了类似递归的公式
			{
				maxlen[i][j]=maxlen[i-1][j-1]+1;
			}
			else//如果找不到相同的就是当前的一定不会都大于这两个,也一定不会比任何一个都小
//这个关系是是本题的关键
			    maxlen[i][j]=max(maxlen[i-1][j],maxlen[i][j-1]);
		}
	 } 
	  cout<<maxlen[len1][len2];
	return 0;
}