算法导论中LCS的C++实现程序
2017-11-08 16:54
211 查看
LCS即最长公共子序列,输入为两个串X、Y,输出为X与Y的最长公共子序列。其求解方法是动态规划,即原序列的最长公共子序列依赖于前缀的最长公共子序列。具体的实现原理参考算法导论(第三版)222页-226页,本文给出它的C++实现程序:
#include<iostream>
#include<string>
#define NUM 20
using namespace std;
int c[NUM][NUM];
char b[NUM][NUM];
void LCS_LENGTH(string X, string Y){
int m = X.length();
int n = Y.length();
for (int i = 1; i <= m; i++)
c[i][0] = 0;
for (int j = 0; j <= n; j++)
c[0][j] = 0;
for (int i = 1; i <= m; i++){
for (int j = 1; j <= n; j++){
if (X[i - 1] == Y[j - 1]){
c[i][j] = c[i - 1][j - 1] + 1;
b[i][j] = 'a';
}
else if (c[i - 1][j] >= c[i][j - 1]){
c[i][j] = c[i - 1][j];
b[i][j] = 'b';
}
else{
c[i][j] = c[i][j - 1];
b[i][j] = 'c';
}
}
}
}
void PRINT_LCS(string X,int m, int n)
{
if (m == 0 || n == 0)
return;
if (b[m]
== 'a'){
PRINT_LCS(X,m - 1, n - 1);
cout << X[m-1];
}
else if (b[m]
== 'b'){
PRINT_LCS(X, m - 1, n);
}
else
PRINT_LCS(X, m, n - 1);
}
void main()
{
string X, Y;
cin >> X >> Y;
LCS_LENGTH(X, Y);
PRINT_LCS(X,X.length(), Y.length());
}
#include<iostream>
#include<string>
#define NUM 20
using namespace std;
int c[NUM][NUM];
char b[NUM][NUM];
void LCS_LENGTH(string X, string Y){
int m = X.length();
int n = Y.length();
for (int i = 1; i <= m; i++)
c[i][0] = 0;
for (int j = 0; j <= n; j++)
c[0][j] = 0;
for (int i = 1; i <= m; i++){
for (int j = 1; j <= n; j++){
if (X[i - 1] == Y[j - 1]){
c[i][j] = c[i - 1][j - 1] + 1;
b[i][j] = 'a';
}
else if (c[i - 1][j] >= c[i][j - 1]){
c[i][j] = c[i - 1][j];
b[i][j] = 'b';
}
else{
c[i][j] = c[i][j - 1];
b[i][j] = 'c';
}
}
}
}
void PRINT_LCS(string X,int m, int n)
{
if (m == 0 || n == 0)
return;
if (b[m]
== 'a'){
PRINT_LCS(X,m - 1, n - 1);
cout << X[m-1];
}
else if (b[m]
== 'b'){
PRINT_LCS(X, m - 1, n);
}
else
PRINT_LCS(X, m, n - 1);
}
void main()
{
string X, Y;
cin >> X >> Y;
LCS_LENGTH(X, Y);
PRINT_LCS(X,X.length(), Y.length());
}
相关文章推荐
- 算法导论第12章-搜索二叉树伪代码的C++程序全实现
- PAT程序设计考题——甲级1086( The best rank ) C++实现
- C/C++程序开发中实现信息隐藏的三种类型
- [图形学] B样条曲线 - 原理和C++实现的演示程序(附源码)
- 采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版)
- DSP 2812: 使用C++实现的SCI主动站程序框架
- 采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版)
- 华为上机密码验证合格程序C++实现
- 算法导论:c++实现红黑树
- C++高精度实现计算程序运行时间
- 采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版)
- 实现简单的端口连接程序C/C++
- 关于C/C++程序里如何实现模糊查找
- c++控制台程序实现定时器
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- c++程序书写规范----接口与实现的分离
- 算法导论第十二章——二叉查找树的C++代码实现
- 从易到难编写C++程序,(4)问题:实现一个大整数表示的BigInt类
- C++实现计算程序运行时间 高精度
- 用C++编写递归函数GetPower(int x,int y)计算x的y次幂,在同一程序里中针对整型和实型实现两个重载的函数;在主程序中实现输入输出