《算法导论》最长子序列问题

来源:互联网 发布: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





原创粉丝点击