MOOC清华《程序设计基础》第6章:最长公共子序列问题(动态规划)
2017-07-22 20:58
281 查看
#include <iostream> #include <cstring> using namespace std; int M = 100; int N = 100; int main() { int lcs[M] ; //M、N足够大 int decision[M] ; enum { I_J, //1+lcs[i+1][j+1],注意是逗号,不是分号 I_1, //lcs[i+1][j],注意是逗号,不是分号 J_1 //lcs[i][j+1],注意这里没有逗号也没有分号 }; //注意这里有分号 char A[M]; char B ; cin >> A; cin >> B; int m = strlen(A); //strlen要求的参数是char*类型的,不能直接定义string A; int n = strlen(B); //设定递推初值 for(int j = 0; j < n + 1; j++) lcs[m][j] = 0; //lcs[m][?] = 0 for(int i = 0; i < m + 1; i++) lcs[i] = 0; //lcs[?] = 0 //递推 for(int i = m - 1; i >= 0; i--) for(int j = n - 1; j >= 0; j--) if(A[i] == B[j]) { lcs[i][j] = 1 + lcs[i + 1][j + 1]; decision[i][j] = I_J; } else if(lcs[i][j + 1] < lcs[i + 1][j]) { lcs[i][j] = lcs[i + 1][j]; decision[i][j] = I_1; } else { lcs[i][j] = lcs[i][j + 1]; decision[i][j] = J_1; } //输出 for(int i = 0, j = 0; i < m && j < n; ) switch(decision[i][j]) { case I_J: cout << A[i]; i++; j++; break; case I_1: i++; break; case J_1: j++; break; } return 0; }
相关文章推荐
- MOOC清华《程序设计基础》第6章第2题:求f(a,b)问题(动态规划)
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(动态规划)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(动态规划,输出方法二)
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(递归法)
- MOOC清华《程序设计基础》第6章:分鱼问题(从A到E递推)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(枚举法)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(动态规划,输出方法一)
- MOOC清华《程序设计基础》第6章:三种递推方法求兔子数列问题(斐波那契数列)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(递推法)
- MOOC清华《程序设计基础》期末考试第6题:鸡兔同笼问题
- MOOC清华《程序设计基础》第5章:分书问题-代码一
- sdut.acm 2012级《程序设计基础Ⅱ)》_动态规划 最长公共子序列问题
- MOOC清华《程序设计基础》第5章:N皇后问题(带矩阵输出)
- MOOC清华《程序设计基础》第5章:青蛙过河问题
- MOOC清华《程序设计基础》第5章:分书问题-代码二
- MOOC清华《程序设计基础》第6章第1题:n级台阶问题(递推法)
- MOOC清华《程序设计基础》第5章:八皇后问题-代码一
- MOOC清华《程序设计基础》第5章:八皇后问题-代码二
- MOOC清华《程序设计基础》第1章第5题:银行存款问题
- MOOC清华《程序设计基础》第2章第5题:银行存款问题2