动态规划

一、动态规划主要思想

  • 若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。动态规划往往用于优化递归问题,例如斐波那契数列,如果运用递归的方式来求解会重复计算很多相同的子问题,利用动态规划的思想可以减少计算量。
  • 动态规划法仅仅解决每个子问题一次,具有天然剪枝的功能,从而减少计算量,一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。

二、解题步骤

  • 1.确定动态规划状态
  • 2 写出状态转移方程(画出状态转移表)
  • 3 考虑初始化条件
  • 4 考虑输出状态
  • 5 考虑对时间,空间复杂度的优化(Bonus)

三、算法例题

3.1 LeetCode第674题:最长连续递增序列

3.1.1 题目描述:

给定一个未经排序的整数数组,找到最长且连续的的递增序列。

3.1.2 题目思路:

这道题是不是一眼看过去和上题非常的像,没错了,这个题目最大的不同就是连续两个字,这样就让这个问题简单很多了,因为如果要求连续的话,那么就不需要和上题一样遍历两遍数组,只需要比较前后的值是不是符合递增的关系。

3.1.3 解题代码:

在这里插入图片描述

3.1.4 总结:

通过这个题目和例题的比较,我们需要理清子序列和子数组(连续序列)的差别,前者明显比后者要复杂 一点,因为前者是不连续的序列,后者是连续的序列,从复杂度来看也很清楚能看到即使穷举子序列也比穷举 子数组要复杂很多。

3.2 LeetCode第5题:最长回文子串

3.2.1 题目描述:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

3.2.2 解题代码:

在这里插入图片描述

3.2.3 总结

这个是一个二维dp的经典题目,需要注意的就是定义dp数组的状态是什么,这里不用长度作为dp值而用 是否是回文子串这个状态来存储也是一个比较巧妙的方法,使得题目变得容易理解。

3.3 LeetCode第516题:最长回文子序列

3.3.1 题目描述:

给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。

3.3.2 解题代码:

在这里插入图片描述

3.3.3 总结:

对于二维的数组的动态规划,采用了画状态转移表的方法来得到输出的状态,这种方法更加直观能看出 状态转移的具体过程,同时也不容易出错。当然具体选择哪种方法则需要根据具体题目来确定,如果状态转移 方程比较复杂的利用这种方法就能简化很多。

3.4 LeetCode第72题:编辑距离

3.4.1 题目描述:

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

3.4.2 解题代码:

在这里插入图片描述

3.5 LeetCode第198题:打劫家舍

3.5.1 题目描述:

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

3.5.2 解题代码:

在这里插入图片描述

3.6 LeetCode第213题:打劫家舍2

3.6.1 题目描述:

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

3.6.2 解题代码:

在这里插入图片描述
资源支持:Datawhale&LeetCode

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值