动态规划简介
动态规划(英语:Dynamic programming,DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题
和最优子结构性质
的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划问题,需要将给定问题分成若干个子问题,再合并子问题的解而得到原问题的解。通常许多子问题很相似,不同于递归方法,动态规划仅仅解决子问题一次,从而减少计算量:一旦某个子问题的解已经算出,则将其记忆化存储,以方便下一次需要同一个子问题解时直接返回。
动态规划需要满足的三个性质:
最优子结构性质:问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构性质。
子问题重叠问题:递归算法自顶向下对问题进行求解过程中,每次产生的子问题并不总是新问题,有些子问题会重复计算多次。
无后效性:各个阶段按照一定顺序排列好之后,对于某个给定的状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的状态。
斐波那契问题
递归算法的复杂度为2^n,而DP算法的时间复杂度为O(N),原因在于递归算法过程中存在着大量的重叠子问题,随着N增大,问题规模呈指数增长。也可以采用记忆化搜索,每次求子问题的解之前先取数组中查看该子问题是否已经解决,如果解决了直接返回,没有解决将结果添加到数组中。记忆化搜索是自顶向下的思考问题,而DP则是自底向上的思考问题。
|
|
LeetCode相关题目
将自己做的LeetCode相关题目整理了一下,以方便以后复习查看。
ClimbingStairs_70
爬楼梯问题:
|
|
CoinChange_322
无限数量的硬币,凑成给定的值,选取所需硬币个数最少的。
递归方法为组合问题,将所有可能的找出来,选出其中最少的。复杂度O(2^n * n)
DP方法,维护一个数组,长度为amount+1, 初始值设置为amount+1,状态转移方程为dp[i] = min(dp[i], dp[i- coins[j] + 1])
|
|
BestTimeToBuyAndSellStockWithCoolDown_309
题目是股票问题的变种,数组prices表示股票第i天的价格,可以多次买卖,限制只有手里没有股票时可以买,同时当你卖了股票,第二天不可以购买。股票问题其实比较简单,如果不限制第二天不可以买的话,就是一个简单的数组最大连续子数组和问题,添加之后需要,有三种状态,买,卖,休息。
|
|
CombinationSumIV_377
|
|
|
|
最长公共子序列问题
|
|
最长上升子序列问题
|
|
0-1背包问题
|
|
完美平方数
|
|
机器人走路问题
|
|
间隔打劫问题
|
|
间隔打劫问题2–收尾相连
|
|