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

467人阅读 评论(0)

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
}


0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
联系我
交流或者提问请加入QQ群：532232743
个人资料
• 访问：169399次
• 积分：2824
• 等级：
• 排名：第14658名
• 原创：118篇
• 转载：2篇
• 译文：0篇
• 评论：54条
博客专栏
 Coursera 斯坦福大学机器学习笔记 文章：15篇 阅读：66427
 《机器学习实战》读书笔记 文章：6篇 阅读：5036
阅读排行
最新评论