动态规划——最长公共子序列(LCS)
2013-08-27 17:51
369 查看
/** * @brief longest common subsequence(LCS) * @author An * @data 2013.8.26 **/ #include <iostream> #include <string> using namespace std; enum Direction { Zero, LeftUp, Up, Left }; static int m; // length of the first sequence static int n; // length of the second sequence static int **c; // the length for every subsequence static Direction **b; // record the path void LCS_Length( string x, string y ); void Print_LCS( string x, int i, int j ); void PrintTable(); int main() { string x = "ABCBDAB"; string y = "BDCABA"; LCS_Length( x, y ); Print_LCS( x, m, n ); cout << endl; PrintTable(); } void LCS_Length( string x, string y ) { // initialize two tables m = x.length(); n = y.length(); c = new int*[m + 1]; b = new Direction*[m + 1]; for ( int i = 0; i <= m; ++i ) { c[i] = new int[n + 1]; b[i] = new Direction[n + 1]; } // zero row and column for ( int i = 0; i <= m; ++i ) { c[i][0] = 0; b[i][0] = Zero; } for ( int j = 1; j <= n; ++j ) { c[0][j] = 0; b[0][j] = Zero; } // calculate the two tables from bottom to top 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] = LeftUp; } 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; } } // end for } //end for } // end LCS_Length() void Print_LCS( string x, int i, int j ) { if ( i == 0 || j == 0 ) { return; } if ( b[i][j] == LeftUp ) { Print_LCS( x, i - 1, j - 1 ); cout << x[i - 1]; } else if ( b[i][j] == Up ) { Print_LCS( x, i - 1, j ); } else { Print_LCS( x, i, j - 1 ); } } void PrintTable() { for ( int i = 0; i <= m; ++i ) { for ( int j = 0; j <= n; ++j ) { cout << c[i][j] << " "; } cout << endl; } cout << endl; for ( int i = 0; i <= m; ++i ) { for ( int j = 0; j <= n; ++j ) { cout << b[i][j] << " "; } cout << endl; } }
相关文章推荐
- LCS最长公共子序列――动态规划
- 动态规划之最长公共子序列(LCS)
- 51nod 1006 最长公共子序列Lcs(经典动态规划)
- 动态规划--3.最长公共子序列LCS和最长公共子字符串
- 用动态规划的方法解决LCS(最长公共子序列)的问题
- 【算法导论实验4】动态规划-最长公共子序列LCS
- 51nod1006---最长公共子序列Lcs(51nod基础:动态规划)
- 【动态规划基础篇】【矩阵取数/最大字段和/最长公共子序列(LCS)/编辑距离/最长上升子序列(LIS)】
- Dynamic Programming longest common subsequence(LCS) 动态规划之最长公共子序列
- LCS(最长公共子序列)和dp(动态规划)
- 动态规划DP_最长公共子序列LCS
- 动态规划-最长公共子序列LCS
- 动态规划——最长公共子序列问题(LCS)
- 动态规划之最长公共子序列(LCS)
- 动态规划解最长公共子序列(LCS)问题 (附可打印LCS完整代码)
- 【动态规划】最长公共子序列问题(LCS)
- 最长公共子序列(LCS---动态规划)
- L - Common Subsequence POJ 1458 (动态规划,LCS 最长公共子序列 )
- 算法导论,动态规划 —— 最长公共子序列问题(LCS)优化python示例