动态规划——LCS 最大子数组问题
源代码:
#include <stdio.h> #include <iostream> using namespace std; int const N = 100; int x[N] = { NULL,1,2,3,2,4,1,2 }; int y[N] = { NULL,2,4,3,1,2,1 }; int m = 7; int n = 6; static int b[N][N]; //记录当前c[i][j]的计值情况 1表示左上 2表示左 3表示上 int c[N][N]; //包含每一阶段LCS的长度 void print(int m, int n); int main() { int i, j; for (i = 0; i <= n; i++) for (j = 0; j <= m; j++) c[i][j] = 0; for (i=1;i<=m;i++) //i表示行j表示列 for (j = 1; j <= n; j++) { if (x[i] == y[j]) { c[i][j] = c[i - 1][j - 1] + 1; b[i][j] = 1; } else if (c[i][j-1] > c[i-1][j]) { c[i][j] = c[i][j-1]; b[i][j] = 2; } else { c[i][j] = c[i - 1][j]; b[i][j] = 3; } } for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) cout << b[i][j] << " "; cout << endl; } print(m, n); return 0; } void print(int m, int n) { if (b[m][n] == 1) { print(m - 1, n - 1); cout << x[m] << " "; } else if (b[m][n] == 2) { print(m, n - 1); } else if (b[m][n] == 3) { print(m - 1, n); } if (m == 0 || n == 0) return; }
结果: