《算法导论》最长子序列问题
来源:互联网 发布:python元组转化为列表 编辑:程序博客网 时间:2024/06/06 05:46
1.借助b[][]数组实现
#include <iostream>#include <cstring>#define N 100using namespace std;int c[N + 1][N + 1];int b[N + 1][N + 1];void lcsLength(char *x, char *y, int xLength, int yLength) {int i, j;for(i = 1; i < xLength; i++)c[i][0] = 0;for(i = 0; i < yLength; i++)c[0][i] = 0;for(i = 1; i <= xLength; i++) {for(j = 1; j <= yLength; j++) {if(x[i - 1] == y[j - 1]) {c[i][j] = c[i - 1][j - 1] + 1;b[i][j] = 1;} else 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;}}}}void printLcs(int b[N + 1][N + 1], char *x, int i, int j) {if(i == 0 || j == 0) return;if(b[i][j] == 1) {printLcs(b, x, i - 1, j - 1);cout<<x[i - 1];} else if(b[i][j] == 2) { printLcs(b, x, i - 1, j);} else {printLcs(b, x, i, j - 1);} }int main() {int i, j, m, n;char x[N], y[N];cin>>x>>y;m = strlen(x);n = strlen(y);lcsLength(x, y, m, n);cout<<c[m][n]<<endl;printLcs(b, x, m, n);return 0;}
2.直接构造最优解(递归实现)
#include <iostream>#include <cstring>#define N 100using namespace std;int c[N + 1][N + 1];void lcsLength(char *x, char *y, int xLength, int yLength) {int i, j;for(i = 1; i < xLength; i++)c[i][0] = 0;for(i = 0; i < yLength; i++)c[0][i] = 0;for(i = 1; i <= xLength; i++) {for(j = 1; j <= yLength; j++) {if(x[i - 1] == y[j - 1])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];elsec[i][j] = c[i][j - 1];}}}void printLcs(int c[N + 1][N + 1], char *x, int i, int j) {if(i == 0 || j == 0) return;if(c[i][j] == c[i - 1][j - 1])printLcs(c, x, i - 1, j - 1);else if(c[i][j] == c[i - 1][j])printLcs(c, x, i - 1, j);else {printLcs(c, x, i, j - 1);cout<<x[i - 1];} }int main() {int i, j, m, n;char x[N], y[N];cin>>x>>y;m = strlen(x);n = strlen(y);lcsLength(x, y, m, n);cout<<c[m][n]<<endl;printLcs(c, x, m, n);return 0;}
3.直接构造最优解
#include <iostream>#include <cstring>#define N 100using namespace std;int c[N + 1][N + 1];void lcsLength(char *x, char *y, int xLength, int yLength) {int i, j;for(i = 1; i < xLength; i++)c[i][0] = 0;for(i = 0; i < yLength; i++)c[0][i] = 0;for(i = 1; i <= xLength; i++) {for(j = 1; j <= yLength; j++) {if(x[i - 1] == y[j - 1])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];elsec[i][j] = c[i][j - 1];}}}void printLcs(int c[N + 1][N + 1], char *x, int i, int j) {char s[N]; int k = c[i][j]; s[k] = '\0'; while(k-->0){ while(c[i][j]==c[i-1][j]) i--; while(c[i][j]==c[i][j-1]) j--; s[k]=x[i - 1]; i--;j--; }cout<<s<<endl;}int main() {int i, j, m, n;char x[N], y[N];cin>>x>>y;m = strlen(x);n = strlen(y);lcsLength(x, y, m, n);cout<<c[m][n]<<endl;printLcs(c, x, m, n);return 0;}
测试数据
ACCGGTCGAGTGCGCGGAAGCCGGCCGAAGTCGTTCGGAATGCCGTTGCTCTGTAAA
阅读全文
0 0
- 《算法导论》最长子序列问题
- 最长公共子序列问题 算法导论15.4
- 算法导论 最长公共子序列
- 算法导论15.4 最长公共子序列
- 算法导论之最长公共子序列
- 最长公共子序列--【算法导论】
- 算法导论之最长递增子序列
- 算法导论(LCS最长公共子序列)
- 算法导论—最长公共子序列
- 算法导论—最长递增子序列
- 算法导论—最长公共子序列
- 算法导论-最长回文子序列
- 算法导论最长公共子序列
- 算法导论 15.4 最长公共子序列
- 算法导论—最长回文子串和子序列
- 算法导论第15章 最长公共子序列问题(LCS)
- 算法导论-分治、最大子序列问题
- 算法导论-分治、最大子序列问题
- Git 修改Git的提交方式 https -> ssh
- MYSQL explain详解之range
- 手记_java注解_咕泡
- java.lang.NoClassDefFoundError: org/springframework/core/ResolvableTypeProvider
- BigDecimal
- 《算法导论》最长子序列问题
- pt-osc全解pt-online-schema-change
- PHP 循环取2个时间之内的年月
- 657. Judge Route Circle
- selenium + python 自动化测试
- 【JavaEE】jsp学习笔记之el技术和jstl
- 选课时间——深搜
- .NET漫游指南-011-.NET Framework中处理和引发事件
- c语言第八次练习题