问题描述:
设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;
}