动态规划做最长公共子序列(LCS)
递推公式如下:
在程序中构建一个如下的长度矩阵
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
string a,b; //a串和b串
int lena,lenb; //lena为a串的长度,lenb为b串的长度
int len[1000][1000]; //长度空间
/*
构造一个a/b串下标对应的长度矩阵
赋初值如下
a/b 0 1 2 3 ..
0 0 0 0 0
1 0
2 0
3 0
..
*/
int LCS() //最长公共子序列
{
int inA,inB; //a、b串对应于长度矩阵的下标,即ina=a+1,inb=b+1
lena=a.length(); lenb=b.length(); //lena为a串的长度,lenb为b串的长度
memset(len,0,sizeof(len)); //初始化长度矩阵
for(int i=0;i<lena;i++) //遍历串
{
for(int j=0;j<lenb;j++) //遍历串
{
inA=i+1; inB=j+1; //将a串下标转换为矩阵的行下标,将b串下标转换为矩阵的列下标
if(a[i]==b[j]) //a串和b串当前位置相同,长度加一
{
len[inA][inB]=len[inA-1][inB-1]+1;
}
else if(len[inA-1][inB]>len[inA][inB-1]) //不同,取上一层迭代的最大值作为当前位置的长度
len[inA][inB]=len[inA-1][inB];
else len[inA][inB]=len[inA][inB-1];
}
}
return len[lena][lenb]; //返回结果
}
int main()
{
int MaxLen;
cin>>a>>b; //输入a串和b串
MaxLen=LCS();
cout<<MaxLen<<endl; //输出结果
return 0;
}
/*
ABCBDAB
BDCABA
MaxLen=4
*/