动态规划———最长公共子序列 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<iostream>
using namespace std;
#include<algorithm>
#include<string>
#include<vector>
int lcs(string s, string t) {
	int slen = s.size();
	int tlen = s.size();
	int i = 0, j = 0;
	//创建二维数组
	vector<int> col(slen + 1, 0);
	vector<vector<int>>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;
}

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值