算法设计有动态规划、分而治之、回溯发、贪心算法。其中,动态规划是面试时最为常考的一种算法。
什么是动态规划?
它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原问题。
比如:斐波那契数列 F(n) = F(n-1) + F(n-2)
- F(0) = 0, F(1) = 1
- F(2) = F(1) + F(0) = 1+0 = 1
- F(3) = F(2) + F(1) = 1 + 1 = 3
- …
应用动态规划解决问题时,我们总是从解决最小问题开始,并把已经解决的子问题的最优解存储下来(可以存到一维或二维数组中),最后把子问题组合起来解决大的问题。通常,分析问题可以从上往下分析,但是解决问题推荐自下而上的方式。
动态规划解决问题的步骤:
- 定义子问题;
- 反复执行。
动态规划和分而治之的区别是什么?
主要针对的子问题不同,子问题是相互重叠的用动态规划,是相互独立的用分而治之。
动态规划练习题:offer10 斐波那契数列、offer89 房屋偷盗、198 打家劫舍、70 爬楼梯