菲波那切数列
以斐波那契数列为例,解法有两种-递归和动态规划,动态规划的方法更优。
为什么说动态规划解法更优秀呢?
递归的解法会碰到一个问题(overlap sub-problem重叠子问题),这就使得每一个f(n)都需要从头递归到最后,其中存在大量的重复计算,利用动态规划的方法可以规避这些额外运算,降低时间复杂度
递归遍历斐波那契额数列时间复杂度是O(2^n) 回想一下一个满二叉树的全部结点公式(2^n-1)
通过动态规划方式时间复杂度为O(n) (其中借助了记忆化搜索)
典型题型
最大值/最优解
通常该类题目可用“选和不选”这种方法来解决
例题1
目前有8个任务,同时只能执行一个任务,任务间可能存在时间冲突,每个任务完成后有相应收益,求怎样才能挣最多的钱,是多少?
例2
有以上一组数字,从中取出一组数字,该组数字两两不相邻,其最大值是多少?
|
|
例3
给定一组数,从中抓取任意数量的数字,使其和为s,如果存在这种情况,返回true,不存在返回false
arr={3,34,4,12,5,2}
s=9
思考
|
|
|
|
例4
你需要爬一个n阶台阶,每次可以向上走1至2步,那么n阶台阶有多少种走法呢?(leetcode)
例5
Say you have an array for which the ith element is the price of a given stock on day i.
If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.
Note that you cannot sell a stock before you buy one.
Input: [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Not 7-1 = 6, as selling price needs to be larger than buying price.
|
|
参考资料
动态规划一般写成非递归形式
动态规划和递归的关系是什么?动态规划属于思想,递归是动态规划实现的一种方式吗?
建立备忘录的迭代就是动态规划
动态规划自底向上
递归 一定要有递归出口 参见递归
出口条件
记忆化搜索
爬楼梯
背包
overlap sub-problem
重叠子问题
剪枝 去掉不需要的情况
subset