动态规划做最长公共子序列(LCS)

递推公式如下:
动态规划做最长公共子序列(LCS)
在程序中构建一个如下的长度矩阵
动态规划做最长公共子序列(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
*/

相关文章: