题目属于老题,就不再复述了,直接贴代码。
/*
LCS公共最大子序列
dp[i][j]=0;//i=0||j=0时。
dp[i][j]=dp[i-1][j-1]+1;//s[i]==t[j]时
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//s[i]!=t[j]时
根据这个规律很容易写出代码
*/
#include<iostream>
#include<cstring>
using namespace std;
const int MAX=100;
int swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
int LCS(const char *str1,const char *str2)
{
int dp[MAX][MAX];
int len1=strlen(str1);
int len2=strlen(str2);
if(len1==0||len2==0)
return 0;
for(int i=0;i<=len1;++i)
dp[i][0]=0;
for(int j=0;j<=len2;++j)
dp[0][j]=0;
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(str1[i]==str2[j])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[len1][len2];
}
int main()
{
char *str="ABCBDAB";
char *str1="BDCABA";
cout<<LCS(str,str1)<<endl;
return 0;
}