动态规划：最长公共子序列问题

1> 若 xm=yn，则 zk=xm=yn，且Zk-1是Xm-1和Yn-1的最长公共子序列；
2> 若 xm≠yn且 zk≠xm ，则 Z是 Xm-1和 Y的最长公共子序列；
3> 若 xm≠yn且 zk≠yn ，则 Z是 X和 Yn-1的最长公共子序列；
其中Xm-1={x1,x2,...,xm-1}，Yn-1={y1,y2,...yn-1}，Zk-1={z1,z2,...,zk-1}。

/*  计算LCS，动态规划从前往后推算  */
#include <iostream>
#include <stdio.h>
#include <memory.h>
#define N 1000
char X[N], Y[N];                //序列X、Y
int C[N][N];                    //Cij为Xi和Yj的最长公共子序列
int lcs(int n, int m);          //计算最长公共子序列
void getAnswer(int n, int m);   //构建答案

int main()
{
int m, n;
printf("Enter n and m: ");
while(2 == scanf("%d%d", &n, &m))
{
printf("Enter %d elements for X:", n);
while(getchar() != '\n') continue;      //清除回车符等
for(int i = 1; i <= n; ++i)
scanf("%c", &X[i]);
printf("Enter %d elements for Y:", m);
while(getchar() != '\n') continue;
for(int i = 1; i <= m; ++i)
scanf("%c", &Y[i]);
printf("MaxLength: %d\nLCS:", lcs(n, m));
printf("\nEnter n and m: ");
}
return 0;
}

int lcs(int n, int m)
{
for(int i = 0; i <= n; ++i)
C[i][0] = 0;
for(int i = 0; i <= m; ++i)
C[0][i] = 0;

for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
{
if(X[i] == Y[j])
C[i][j] = C[i-1][j-1] + 1;
else if(C[i-1][j] >= C[i][j-1])
C[i][j] = C[i-1][j];
else
C[i][j] = C[i][j-1];
}
}
return C[n][m];
}

{
if(0 == n || 0 == m)
return;
if((C[n][m] == C[n-1][m-1] + 1) && (X[n] == Y[m]))  //一定要判断X[n]和Y[m]是否相等
{
printf("%c", X[n]);     //等价于printf("%c", Y[m]);
}
else if(C[n][m] == C[n-1][m])
else
}

/*  计算LCS，动态规划从后往前推算  */
#include <iostream>
#include <stdio.h>
#include <memory.h>
#define N 1000
char X[N], Y[N];                                //序列X、Y
int C[N][N];                                    //Cij为Xi和Yj的最长公共子序列
int lcs(int n, int m);                          //计算最长公共子序列
void getAnswer(int x, int y, int n, int m);     //构建答案

int main()
{
int m, n;
printf("Enter n and m: ");
while(2 == scanf("%d%d", &n, &m))
{
printf("Enter %d elements for X:", n);
while(getchar() != '\n') continue;      //清除回车符等
for(int i = 1; i <= n; ++i)
scanf("%c", &X[i]);
printf("Enter %d elements for Y:", m);
while(getchar() != '\n') continue;
for(int i = 1; i <= m; ++i)
scanf("%c", &Y[i]);
printf("MaxLength: %d\nLCS:", lcs(n, m));
printf("\nEnter n and m: ");
}
return 0;
}

int lcs(int n, int m)
{
for(int i = 1; i <= n + 1; ++i)
C[i][0] = 0;
for(int i = 1; i <= m + 1; ++i)
C[0][i] = 0;

for(int i = n; i >= 1; --i)
{
for(int j = m; j >= 1; --j)
{
if(X[i] == Y[j])
C[i][j] = C[i+1][j+1] + 1;
else if(C[i+1][j] >= C[i][j+1])
C[i][j] = C[i+1][j];
else
C[i][j] = C[i][j+1];
}
}
return C[1][1];
}

void getAnswer(int x, int y, int n, int m)
{
if(x == n + 1 || y == m + 1)
return;
if((C[x][y] == C[x+1][y+1] + 1) && (X[x] == Y[y]))
{
printf("%c", X[x]);     //等价于printf("%c", Y[y]);
}
else if(C[x][y] == C[x+1][y])
else
}


动态规划算法之最长公共子序列问题

2016-03-24 16:56:03

动态规划之最长公共子序列问题 C++实现

2016-11-08 12:12:53

动态规划基础篇之最长公共子序列问题

2017-08-08 21:12:15

最长公共子序列问题（动态规划求解）

2016-02-08 10:45:48

Java语言描述：动态规划法之最长公共子序列问题

2015-06-08 15:45:21

动态规划求解最长公共子序列（LCS）

2013-11-15 20:23:47

动态规划 最长公共子序列 过程图解

2016-05-29 22:54:25

java动态规划算法--最长公共子序列问题

2014-11-07 16:57:42

Java-LCS最长公共子序列（动态规划实现）

2016-10-16 14:40:20

动态规划--求最长公共子序列问题

2009年10月27日 1KB 下载