《算法导论》学习总结 — 19.第15章 动态规划(4) 案例之LCS
2011-05-26 18:55
417 查看
建议先看看前言:/article/5075824.html
这个案例也比较简单,最长公共子序列(LCS),网上的分析非常多,给力啊!
按照上一篇总结所说的,找状态转移方程:
所以按照所给方程,写代码的工作就非常非常简单轻松了:
看书上图15-6的结果图:
又是一个给力的图,建议自己按照程序把这个图画出来.
另外,说到LCS,不得不说的是LIS(最长上升子序列),也是一个DP,我曾经总结过:
http://www.wutianqi.com/?p=1850
Tanky Woo 标签: DP,动态规划,LCS
在我独立博客上的原文:http://www.wutianqi.com/?p=2505
欢迎大家互相学习,互相进步!
这个案例也比较简单,最长公共子序列(LCS),网上的分析非常多,给力啊!
按照上一篇总结所说的,找状态转移方程:
所以按照所给方程,写代码的工作就非常非常简单轻松了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | /* Author: Tanky Woo Blog: www.WuTianQi.com About: 《算法导论》15.4 最长公共自序列(LCS) */ #include <iostream> using namespace std; char b[20][20]; int c[20][20]; char x[20], y[20]; void LCS() { int m = strlen(x+1); int n = strlen(y+1); for(int i=1; i<=m; ++i) c[i][0] = 0; for(int j=1; j<=n; ++j) c[0][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] = '\\'; // 注意这里第一个\\是转移字符,代表\ } else if(c[i-1][j] >= c[i][j-1]) { c[i][j] = c[i-1][j]; b[i][j] = '|'; } else { c[i][j] = c[i][j-1]; b[i][j] = '-'; } } } void printLCS(int i, int j) { if(i == 0 || j == 0) return; if(b[i][j] == '\\') { printLCS(i-1, j-1); cout << x[i] << " "; } else if(b[i][j] == '|') printLCS(i-1, j); else printLCS(i, j-1); } int main() { cout << "Input the array A:\n"; cin >> x+1; cout << "Input the array B:\n"; cin >> y+1; LCS(); printLCS(strlen(x+1), strlen(y+1)); } |
又是一个给力的图,建议自己按照程序把这个图画出来.
另外,说到LCS,不得不说的是LIS(最长上升子序列),也是一个DP,我曾经总结过:
http://www.wutianqi.com/?p=1850
Tanky Woo 标签: DP,动态规划,LCS
在我独立博客上的原文:http://www.wutianqi.com/?p=2505
欢迎大家互相学习,互相进步!
相关文章推荐
- 《算法导论》学习总结 — 16.第15章 动态规划(1) 基本入门
- 《算法导论》学习总结 — 17.第15章 动态规划(2) 案例之装配线调度
- 《算法导论》学习总结 — 20.第15章 动态规划(5) 分析几道DP题
- 《算法导论》学习总结 — 18.第15章 动态规划(3) 基础入门2
- 《算法导论》读书笔记之第15章 动态规划[总结]
- 算法导论学习笔记之1--从LCS到动态规划
- 算法导论第15章 动态规划-总结
- 《算法导论》第15章 动态规划总结
- 《算法导论》读书笔记之第15章 动态规划[总结]
- 算法导论学习笔记(十二):动态规划(二):最长公共子序列(LCS)
- 《算法导论》读书笔记之第15章 动态规划[总结]
- 《算法导论》第15章 动态规划 (1)装配线调度
- 算法导论-第15章-动态规划:钢条切割问题自底向下方法C++实现
- Java基础学习总结(19)——Java环境变量配置
- 算法导论-第15章-动态规划:最长公共子序列(空间复杂度改进版)C++实现
- 算法导论学习笔记----动态规划
- 《算法导论》学习总结 — 11. 第12章 二叉查找树
- 算法导论,动态规划 —— 最长公共子序列问题(LCS,python示例)
- 《算法导论》学习总结 — 14. 第13章 红黑树(3)
- 《算法导论》学习总结 — 15. 第13章 红黑树(4)