1.最优子结构
证明:对于的最长公共子序列,则
(1)若,则,且是和的最长公共子序列;
(2)若,且,且是和的最长公共子序列;
(3)若,且,且是和的最长公共子序列;
(1) 设不是和的最长公共子序列,
则存在一个更优解,且;
所以,即;
与是和的最长公共子序列矛盾。
(2)设不是和的最长公共子序列
则存在一个更优解,且;
而又均为和的最长公共子序列;
所以与是和的最长公共子序列矛盾。
(3)设不是和的最长公共子序列
则存在一个更优解,且;
而又均为和的最长公共子序列;
所以与是和的最长公共子序列矛盾。
2.递推方程
3.最优值
#include <bits/stdc++.h>
using namespace std;
void LCSLength(int m,int n,char* x,char* y,int **c,int **b)
{
//i,j表示x和y数组的下标,c[i][j]表示xi子串和yj子串的最长公共子序列
for(int i=1; i<=m; i++)
c[i][1]=0;
for(int i=1; i<=n; i++)
c[1][i]=0;
for(int i=1; i<=m; i++)
{
for(int j=1; j<=n; j++)
{
if(x[i]==y[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
}
else
{
//c[i][j]=max(c[i-1][j],c[i][j-1]);
if(c[i-1][j]>c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=2;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
}
cout<<endl;
}
void LCS(int i,int j,char* x,int** b)
{
if (i ==0 || j==0) return;
if (b[i][j]== 1)
{
LCS(i-1,j-1,x,b);
cout<<x[i];
}
else if (b[i][j]== 2)
LCS(i-1,j,x,b);
else
LCS(i,j-1,x,b);
}
int main()
{
string X,Y;
cin>>X>>Y;
int m=X.length();
int n=Y.length();
char x[m+1],y[n+1];
for(int i=1; i<=m; i++)
{
x[i]=X[i-1];
}
for(int i=1; i<=n; i++)
{
y[i]=Y[i-1];
}
//c、b数组大小(m+1,n+1)
int** c=(int**)malloc(sizeof(int*) * (m+1));
for(int i=0; i<m+1; i++)
{
c[i]=(int*)malloc(sizeof(int) * (n+1));
}
int** b=(int**)malloc(sizeof(int*) * (m+1));
for(int i=0; i<m+1; i++)
{
b[i]=(int*)malloc(sizeof(int) * (n+1));
}
for(int i=0;i<=m;i++)
{
for(int j=0;j<=n;j++)
{
c[i][j]=0;
b[i][j]=0;
}
}
LCSLength(m,n,x,y,c,b);
cout<<"公共子序列是:"<<endl;
LCS(m,n,x,b);
cout<<endl;
cout<<"c:"<<endl;
for(int i=1; i<m+1; i++)
{
for(int j=1; j<n+1; j++)
{
printf("%-2d ",c[i][j]);
}
cout<<endl;
}
cout<<endl;
cout<<"b:"<<endl;
for(int i=1; i<m+1; i++)
{
for(int j=1; j<n+1; j++)
{
printf("%-2d ",b[i][j]);
}
cout<<endl;
}
}
X={ABCBDAB},Y={BDCABA}
c[i][j]
0 | 1B | 2D | 3C | 4A | 56B | A | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1A | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
2B | 0 | 1 | 1 | 1 | 1 | 2 | 2 |
3C | 0 | 1 | 1 | 2 | 2 | 2 | 2 |
4B | 0 | 1 | 1 | 2 | 2 | 3 | 3 |
5D | 0 | 1 | 2 | 2 | 2 | 3 | 3 |
6A | 0 | 1 | 2 | 2 | 3 | 3 | 4 |
7B | 0 | 1 | 2 | 2 | 3 | 4 | 4 |
b[i][j]
0 | 1B | 2D | 3C | 4A | 56B | A | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1A | 0 | 3 | 3 | 3 | 1 | 3 | 1 |
2B | 0 | 1 | 3 | 3 | 3 | 1 | 3 |
3C | 0 | 2 | 3 | 1 | 3 | 3 | 3 |
4B | 0 | 1 | 3 | 2 | 3 | 1 | 3 |
5D | 0 | 2 | 1 | 3 | 3 | 2 | 3 |
6A | 0 | 2 | 2 | 3 | 1 | 3 | 1 |
7B | 0 | 1 | 2 | 3 | 2 | 1 | 3 |