题意:给你两个字符串,让你求出两个字符串中最长的相同子序列
思路:这道题是经典的最长相同子序列的题目,可以用动态规划来做
首先定义一个二维数组dp[i][j],并且我们规定,dp[i][j]存的值的意义是字符串a从0到i与字符串b从0到j的最长的公共子序列
那么对于每一个dp[i][j],它的值只能来自一下几种情况:
1 当a[i]==b[j]时,此时dp[i][j]=dp[i-1][j-1]+1,不懂可以仔细想想dp数组的定义
2如果a[i]!=b[j]那么dp[i][j]的值为dp[i-1][j],dp[i][j-1]二者的最大值
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int dp[10000][10000];
int main()
{
string a,b;
while(cin>>a>>b)
{
memset(dp,0,sizeof(dp));
//注意dp数组的初始化,dp[0][0]
//与dp[1][0]和dp[0][1]都应被初始化为0
for(int i=1;i<=a.size();i++)
{//因为每个下标i都可能进行i-1的操作
//如果以i从0开始的话数组会越界,所以i从1开始,j同理
for(int j=1;j<=b.size();j++)
{
if(a[i-1]==b[j-1])
{
//i-1的操作
dp[i][j]=dp[i-1][j-1]+1;
}
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
printf("%d\n",dp[a.size()][b.size()]);
}
}