最近在刷算法题目,突然重新思考一下大二时学习的算法分析与设计课程,发现当时没有学习明白,只是记住了几个特定的几个题型;现在重新回归的时候,上升到了方法学上了;感觉到了温故知新的感觉;一下总结自童咏昕老师的算法设计与分析课程;
分而治之思路:(三部曲,都很重要)
- 分解原问题;(存在子问题,可以递归求解,子问题不重叠,子问题比原问题规模小)
- 解决子问题;
- 合并问题解;
- 经典问题:
- 归并排序,最大子数组问题,逆序计数问题;
- 快速排序,次序选择问题;
动态规划思路:(存在重叠子问题)
- 问题结构分析;(存在子问题,可以递归求解,子问题重叠,带有memo的递归求解,动态规划自底向上)
- 递推关系建立;
- 自底向上计算;(可以先用小规模数据找到求解规律,编程)
- 最优方案追踪;(根据求解的顺序,判断当前问题规模的解,来自于那个子问题)
- 经典问题:
- 0-1背包问题(物品不可分割);最大子数组问题;
- 最长公共子序列问题;最长公共子串问题;最小编辑距离问题;
- 钢条切割问题;矩阵链乘法问题;
贪心策略思路:
- 提出贪心策略;
- 证明贪心策略正确;(数学归纳法或反证法)
- 经典问题:
- 部分背包问题(物品可分割,可以按照价值和重量比来进行排序);
- 霍夫曼编码问题;活动选择问题;
求解思路:
经典问题:
保持更新,转载请注明出处;更多内容请关注cnblogs.com/xuyaowen;