动态规划

动态规划

 动态规划算法是用来解决一类最优化问题的算法思想,比如说你运用了一个算法解决了一个问题,但是呢,这个算法时间复杂度比较高,那么我们如何进行优化降低它的时间复杂度呢?当然优化算法有很多种,这里运用动态规划算法来进行优化,使用动态规划可以让时间复杂度降到最低,因为它是用来解决一类最优化问题的算法思想。

先了解两个概念:重叠子问题最优子结构
可以使用递归或者递推的写法来实现动态规划,其中递归写法在此处又称作记忆化搜索

重叠子问题:如果一个问题的求解可以被分为若干个子问题的求解,且这些子问题会不断的重复出现,那么就称这个问题拥有重叠子问题。
【一般我们解决重叠子问题的时候,会利用dp数组将这些子问题的解存放起来,当下次用到,就直接调用dp数组,而不用又去重新求解,浪费时间---->这种解法我们称之为记忆化搜索,记忆化搜索常用递归去实现:比如斐波那契数列递归记忆化搜索、01背包问题运用递归记忆化搜索等等,,,我们也称之为动态规划的递归写法】
动态规划用递归去实现的计算方式是自顶向下,即从目标问题开始,将它分解成子问题的组合,直到分解至边界为止(利用dp数组记录子问题的解,以便下次调用的时候直接返回dp记录的结果)。

最优子结构:如果一个问题的最优解可以由其子问题的最优解有效构造/递推出来,那么称这个问题拥有最优子结构。
【对于这种拥有最优子结构的问题解法,我们往往可以利用递推去解决,即利用dp数组进行递推,比如背包问题,数塔问题,最长公共子序列问题,DAG最长路的求解,最长回文字串问题等等,,我们称之为动态规划的递推写法】
动态规划用递推去实现的计算方式是自底向上,即从边界开始(利用dp数组进行初始化,即考虑边界情况,在边界,dp数组是可以确定的)不断向上解决问题,直到解决了目标问题。

转载的一篇文章,文中以leetcode 120.三角形最小路径和为例,先介绍了一般的递归解法,由于存在大量重复计算超时,从而借助备忘录引出记忆化递归。递归容易造成栈溢出,所以可以考虑把递归方式转化为递推方式。同时,在记录状态的数据结构也可以进行优化。

递归到动规的一般转化方法
递归一般是容易想到的方法,但是由于存在重复计算和栈溢出等问题,除了使用备忘录,还可以转化为递推方式,
递归函数有n个参数,就定义一个n维的数组,数组的下标是递归函数参数的取值范围,数组元素的值是递归函数的返回值,这样就可以从边界值开始, 逐步填充数组,相当于计算递归函数值的逆过程。

动规解题的一般思路

1 将原问题分解为子问题
  把原问题分解为若干个子问题,子问题和原问题形式相同或类似,只不过规模变小了。1.子问题都解决,原问题即解决。2.子问题的解一旦求出就会被保存,所以每个子问题只需求解一次。
2. 确定状态
  在用动态规划解题时,我们往往将和子问题相关的各个变量的一组取值,称之为一个“状态”。一个“状态”对应于一个或多个子问题, 所谓某个“状态”下的“值”,就是这个“状态”所对应的子问题的解。状态就是某个问题某组变量,状态空间就是该问题的所有组变量。所有“状态”的集合,构成问题的“状态空间”。“状态空间”的大小,与用动态规划解决问题的时间复杂度直接相关。
3. 确定一些初始状态(边界状态)的值
  以“三角形最小路径和”为例,初始状态就是底边数字,值就是底边数字值。
4. 确定状态转移方程
  定义出什么是“状态”,以及在该“状态”下的“值”后,就要找出不同的状态之间如何迁移――即如何从一个或多个“值”已知的 “状态”,求出另一个“状态”的“值”(递推型)。状态的迁移可以用递推公式表示,此递推公式也可被称作“状态转移方程”。

能用动规解决的问题的特点
1 问题具有最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质。
2 无后效性。当前的若干个状态值一旦确定,则此后过程的演变就只和这若干个状态的值有关,和之前是采取哪种手段或经过哪条路径演变到当前的这若干个状态,没有关系。

解题

一维

递推
由起始的状态,向后逐渐推出所有的状态。

leetcode 70.爬楼梯
leetcode 121. 买卖股票的最佳时机
leetcode 198.打家劫舍
leetcode 213.打家劫舍 II
leetcode 303. 区域和检索 - 数组不可变
leetcode 338. 比特位计数
leetcode 746.使用最小花费爬楼梯

leetcode 96. 不同的二叉搜索树
leetcode 343. 整数拆分
leetcode 279. 完全平方数

子字符串
子字符串的选取,一般是以i为结尾的字符串,这样可以避免升阶为二维dp。

leetcode 32. 最长有效括号
leetcode 53. 最大子序和
leetcode 91. 解码方法
leetcode 139. 单词拆分
leetcode 300. 最长上升子序列
leetcode 322. 零钱兑换

二次dp
使用两次动态规划

leetcode 152.乘积最大子序列

二维

字符串匹配

leetcode 10. 正则表达式匹配
leetcode 44. 通配符匹配
leetcode 72. 编辑距离
leetcode 115.不同的子序列

数组

leetcode 62.不同路径
leetcode 63.不同路径 II
leetcode 64. 最小路径和
leetcode 85. 最大矩形
leetcode 120.三角形最小路径和
leetcode 174.地下城游戏
leetcode 304. 二维区域和检索 - 矩阵不可变

leetcode 5. 最长回文子串
leetcode 309.最佳买卖股票时机含冷冻期
leetcode 312. 戳气球
leetcode 647. 回文子串
leetcode 714.买卖股票的最佳时机含手续费

三维

leetcode 123.买卖股票的最佳时机 III
leetcode 188.买卖股票的最佳时机 IV
leetcode 1139. 最大的以 1 为边界的正方形

其它:

leetcode 337. 打家劫舍 III
leetcode 494. 目标和

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值