最长公共子序列LCS(动态规划法)
2017-07-28 10:46
190 查看
//动态规划法 //最长公共子序列 //c数组指出子序列长度,b数组为具体路径 #include <iostream> #define N 1000 #define UPLEFT 1 #define UP 2 #define LEFT 3 int c ,b ; using namespace std; void PRINT_LCS(int b[] ,char X[],int i,int j) //打印路径 { if(i==0 || j==0) return ; if(b[i][j] == UPLEFT) { PRINT_LCS(b,X,i-1,j-1); cout << X[i] << ends; } else if(b[i][j] == UP) PRINT_LCS(b,X,i-1,j); else PRINT_LCS(b,X,i,j-1); } LCS(char X[],char Y[],int m,int n) { for(int i=0;i<=m;i++) c[i][0]=0; for(int j=0;j<=n;j++) c[0][j]=0; for(int i=0;i<=m;i++) { for(int j=0;j<=n;j++) b[i][j]=0; } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(X[i] == Y[j]) { c[i][j]=c[i-1][j-1]+1; b[i][j]=UPLEFT; } else if(c[i-1][j] >= c[i][j-1]) { c[i][j]=c[i-1][j]; b[i][j]=UP; } else { c[i][j]=c[i][j-1]; b[i][j]=LEFT; } } } PRINT_LCS(b,X,m,n); } int main(int argc, char *argv[]) { int m,n; cin >> m >> n; char X ,Y ; for(int i=1;i<=m;i++) cin >> X[i]; for(int i=1;i<=n;i++) cin >> Y[i]; LCS(X,Y,m,n); cout << endl; cout << c[m] <<endl; cout << "Hello World!" << endl; return 0; }
相关文章推荐
- 动态规划法——最长公共子序列(LCS)
- 《github一天一道算法题》:动态规划法解决最长公共子序列(LCS)问题的最简单方法
- Java实现算法导论中最长公共子序列(LCS)动态规划法
- 动态规划法(十)最长公共子序列(LCS)问题
- 算法学习心得——动态规划法实现最长公共子序列(LCS)
- LCS最长公共子序列
- 动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- 【动态规划基础篇】【矩阵取数/最大字段和/最长公共子序列(LCS)/编辑距离/最长上升子序列(LIS)】
- 51nod1006 最长公共子序列Lcs
- LCS问题(最长公共子序列)-动态规划实现
- 最长公共子序列(LCS---动态规划)
- Java-LCS最长公共子序列(动态规划实现)
- 【tyvj】【dp】最长公共子序列(LCS)
- 算法导论-----最长公共子序列LCS(动态规划)
- 动态规划之最长公共子序列 (LCS )
- 动态规划--3.最长公共子序列LCS和最长公共子字符串
- LCS最长公共子序列的另一种解决方法
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)
- 动态规划5:LCS最长公共子序列问题