最长公共子序列

问题描述:

X=<x1,x2,…,xn>,Y=<y1,y2,…,ym>分别是长度为n和m的序列,X和Y的最长公共子序列是这样一个子序列lcs=<xk1,xk2,…,xkp>,其中1<=k1<k2<…<kp<=n且有xk1=ys1,xk2=ys2,…,xkp=ysp,1<=s1<s2<...<sp<=m。求p的最大值。

解决方法:

动态规划方法:

f(i,j)=0, i=0 or j=0,

f(i,j)=f(i-1,j-1), xi=yj and i,j>0

f(i,j)=max{f(i-1,j),f(i,j-1)}, xi!=yj and i,j>0

算法实现:

#include <iostream>
#include <cstring>

template<typename T> int LongestCommonSequence(T *, T *, const int size1, const int size2);

using namespace std;
int main(void)
{
	const int SIZE = 30;
	char arr1[SIZE]="asdfsdfasdfsdf";
	char arr2[SIZE]="dfasdfdfasdfdf";
	int len_max = 0;
	
	len_max = LongestCommonSequence(arr1, arr2, strlen(arr1), strlen(arr2));

	cout << len_max << endl;
	return 0;
}

template<typename T> int LongestCommonSequence(T *arr1, T *arr2, const int size1, const int size2)
{
	if (size1 < 0 || size2 < 0)
	{
		return 0;
	}
	int len_max;
	int *len = new int[size1+1];
	for (int i = 0; i <= size1; ++i)
	{
		len[i] = 0;
	}
	for (int i = 0; i < size2; ++i)
	{
		for (int j = 0, tmp1, tmp2 = 0; j < size1 ; ++j)
		{
			tmp1 = tmp2;
			tmp2 = len[j+1];//save f(i-1,j-1) temporarily
			if (arr2[i] == arr1[j])
			{
				len[j+1]=tmp1+1;
			}
			else
			{
				len[j+1]=(len[j+1]>=len[j])?len[j+1]:len[j];
			}
		}
	}
	len_max = len[size1];
	
	delete[] len;
	return len_max;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值