动态规划———最长公共子序列 c++完整代码

  • 最长公共子序列(LCS)定义:

给定序列s1={1,3,4,5,6,7,7,8}, s2={3,5,7,4,8,6,7,8,2},s1和s2的相同子序列,且该子序列的长度最长,即是LCS。
公共子序列就是,s1和s2中都要包含的元素,并且顺序是保持不变的;其中上述s1和s2一个最长公共子序列是{ 3,4,6,7,8 };

  • 递推关系:

二维数组arr[i][j]的元素存放,子串s中,s0s1s2s3……si-1,和子t中,t0t1t2t3……..ti-1这两个子串的LCS长度;

1)当si=tj时——arr[i][j]=arr[i-1]+arr[j-1]+1;

2)当 si≠tj时——arr[i][j]=max(arr[i-1][j],arr[i][j-1]);

  • 代码实现
#include
using namespace std;
#include
#include
#include
int lcs(string s, string t) {
	int slen = s.size();
	int tlen = s.size();
	int i = 0, j = 0;
	//创建二维数组
	vector col(slen + 1, 0);
	vector>arr(tlen + 1, col);
	for (int i = 1; i <=slen; i++) {  //逐行从左往右填写表
		for (int j = 1; j <=tlen; j++) {
			if (s[i-1] == t[j-1]) {
				arr[i][j] = arr[i - 1][j - 1] + 1;
			}
			else
			{
				arr[i][j] = (arr[i - 1][j]) > (arr[i][j - 1]) ? arr[i - 1][j] : arr[i][j - 1];
			}
		}
	}
	return arr[slen][tlen];
}
int main() {
	string s = "13456778";
	string t = "357486782";
	int len = lcs(s, t);
	cout << "最长公共子序列长度为:" << len << endl; //输出为5
	return 0;
	system("pause");
	return 0;
}

你可能感兴趣的:(算法,c++,算法)