文章目录

  • 主要思想
  • 模板步骤
  • 例题
    • 300. 最长上升子序列
    • 674. 最长连续递增序列
    • 5. 最长回文子串
    • 516. 最长回文子序列
    • 72. 编辑距离
    • 198. 打家劫舍
    • 213. 打家劫舍 II

主要思想

若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。动
态规划往往用于优化递归问题,例如斐波那契数列,如果运用递归的方式来求解会重复计算很多相同的
子问题,利用动态规划的思想可以减少计算量。

动态规划法仅仅解决每个子问题一次,具有天然剪枝的功能,从而减少计算量,

一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表

模板步骤

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

例题

300. 最长上升子序列

给定一个无序的整数数组,找到其中最长上升子序列的长度。

class Solution:def lengthOfLIS(self, nums: List[int]) -> int:if not nums:return 0dp = [1]*len(nums)for i in range(1,len(nums)):for j in range(i):if nums[i]>nums[j]:dp[i] = max(dp[i], dp[j]+1)return max(dp)

确定动态规划状态:使用一个数组dp来存放以序列中第i个数结尾的最长递增子序列长度
状态转移方程:比较当前dp[i]与之前所有索引产生的最长子序列长度
初始条件:初始值均为1
输出状态:dp数组的最大值
复杂度优化:二分法+动态规划

674. 最长连续递增序列

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

class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:n=len(nums)if not nums or n<0:return 0dp=[1]*nfor i in range(1,n):if nums[i]>nums[i-1]:dp[i]=dp[i-1]+1return max(dp)

5. 最长回文子串

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

class Solution:def longestPalindrome(self, s: str) -> str:dp = [[False]*len(s) for _ in range(len(s))]max_len = 1start = 0for j in range(1, len(s)):for i in range(j):if s[i] == s[j]:if j-i<3:dp[i][j] = Trueelse:dp[i][j] = dp[i+1][j-1]if dp[i][j]:if j-i+1>max_len:max_len = j-i+1start = ireturn s[start:start+max_len]

516. 最长回文子序列

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

class Solution:def longestPalindromeSubseq(self, s: str) -> int:dp = [[0]*len(s) for _ in range(len(s))]max_value = 1for m in range(len(s)):dp[m][m] = 1for i in range(len(s)-1,-1,-1):for j in range(i, len(s)):if s[i] == s[j]:if j-i<3:dp[i][j] = j-i+1else:dp[i][j] = dp[i+1][j-1]+2else:dp[i][j] = max(dp[i+1][j], dp[i][j-1])max_value = max(max_value, dp[i][j])return max_value

72. 编辑距离

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

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符
class Solution:def minDistance(self, word1, word2):""":type word1: str:type word2: str:rtype: int"""n = len(word1)m = len(word2)# 有一个字符串为空串if n * m == 0:return n + m# DP 数组D = [ [0] * (m + 1) for _ in range(n + 1)]# 边界状态初始化for i in range(n + 1):D[i][0] = ifor j in range(m + 1):D[0][j] = j# 计算所有 DP 值for i in range(1, n + 1):for j in range(1, m + 1):left = D[i - 1][j] + 1down = D[i][j - 1] + 1left_down = D[i - 1][j - 1] if word1[i - 1] != word2[j - 1]:left_down += 1

198. 打家劫舍

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

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

class Solution:def rob(self, nums: List[int]) -> int:if len(nums) == 0:return 0if len(nums) == 1:return nums[0]if len(nums) == 2:return max(nums[1], nums[0])ans = [0]*len(nums)ans[0] = nums[0]ans[1] = max(nums[0], nums[1])for i in range(2, len(nums)):ans[i] = max(ans[i-2]+nums[i], ans[i-1])return ans[-1]

213. 打家劫舍 II

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

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

class Solution:def rob(self, nums: List[int]) -> int:if len(nums) == 0:return 0if len(nums)<4:return max(nums)ans = [0]*len(nums)ans[0] = nums[0]ans[1] = ans[0]for i in range(2,len(nums)-1):ans[i] = max(ans[i-2]+nums[i], ans[i-1])answer = ans[-2]ans[0] = 0ans[1] = nums[1]for i in range(2,len(nums)):ans[i] = max(ans[i-2]+nums[i], ans[i-1])return max(answer, ans[-1])

本博客部分内容来自datawhale的leetcode组队学习

leetcode组队学习——动态规划相关推荐

  1. leetcode组队学习——查找(二)

    文章目录 1.两数之和 15. 三数之和 16. 最接近的三数之和 18. 四数之和 454. 四数相加 II 49. 字母异位词分组 447. 回旋镖的数量 149. 直线上最多的点数 1.两数之和 ...

  2. leetcode组队学习——查找(一)

    文章目录 方法:考虑的基本数据结构 例题 202. 快乐数 205. 同构字符串 242. 有效的字母异位词 290. 单词规律 349. 两个数组的交集 350. 两个数组的交集 II 451. 根 ...

  3. Leetcode组队学习——分治

    文章目录 主要思想 分治算法的步骤 分治法适用的情况 伪代码 3道例题 169.多数元素 53.最大子序和 50. Pow(x, n) 主要思想 分治算法的主要思想是将原问题递归地分成若干个子问题,直 ...

  4. 【组队学习】【31期】LeetCode 刷题

    LeetCode 刷题 航路开辟者:杨世超 领航员:刘军 航海士:杨世超.李彦鹏.叶志雄.赵子一 基本信息 开源内容:https://github.com/itcharge/LeetCode-Py 开 ...

  5. 第8期Datawhale组队学习计划

    第8期Datawhale组队学习计划马上就要开始啦 这次共组织15个组队学习,涵盖了AI领域从理论知识到动手实践的内容 按照下面给出的最完备学习路线分类,难度系数分为低.中.高三档,可以按照需要参加 ...

  6. 转发:Datawhale第七期组队学习计划

    编者注:Datawhale是一个公益组织,也是AiUnion的四个成员之一,所有学习计划是免费的. 第7期Datawhale组队学习计划 马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论 ...

  7. Datawhale 暑期组队学习计划

    Datawhale暑期组队学习计划 马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论知识到动手实践的内容 按照下面给出的最完备学习路线分类 难度系数分为低.中.高三档 可以按照需要参加 ...

  8. 第7期 Datawhale 组队学习计划

    马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论知识到动手实践的内容 按照下面给出的最完备学习路线分类 难度系数分为低.中.高三档 可以按照需要参加 - 学习路线 - 基础知识 01 统 ...

  9. Datawhale 三月组队学习计划

    这次一共打算组织14个组队学习,涵盖了AI领域从理论知识到动手实践的内容,难度系数分为低.中.高档,可以按照需要参加哦 组队学习信息 1 /Python基础 课程设计:马晶敏,叶梁.许辉 组队学习说明 ...

最新文章

  1. CF223C【Partial Sums】(组合数学+乱搞)
  2. halcon知识:ncc_model模板匹配
  3. 当中国数据中心建设提速,能耗问题引关注
  4. 如何为你的回归问题选择最合适的机器学习方法?
  5. 【solr专题之一】Solr快速入门
  6. 你应该知道的 HBase 基础,都在这儿了
  7. Sublime 插件安装、卸载、更新
  8. java第一次作业计科2班马浩加
  9. JavaScript 代码简洁之道
  10. Go语言命令行工具介绍-3
  11. [杂谈] 2013年新目标
  12. 工程师视角的手游SDK
  13. php自定义函数全局声明,【phpcms-v9】phpcms-v9中自定义全局函数文件:extention.func.php...
  14. js输出sb (!(~+[]) + {})[--[~+][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]] 图解
  15. 使用 28x28 bmp測試訓練後的模型 tensorflow mnist jupyter notebook
  16. ROS2知识(2):网络设施
  17. 二维码扫描的样式总结
  18. scala 相关基础知识
  19. 【虾皮选品分享】马来西亚/菲律宾市场时尚美妆热销趋势
  20. yesry 通过桥接器,Java调用任何API或DLL

热门文章

  1. 如何用计算机制作公式,常用的那些软件能做公式编辑器
  2. java猜数游戏有次数限制_幼小衔接可以用的超有趣的数学小游戏
  3. android中获取应用程序(包)的信息,Android中获取应用程序(包)的信息PackageManager的使用(一).doc...
  4. java斗地主怎么出牌_斗地主滑动选牌出牌(Cocos Creator)
  5. 企业级生产环境CICD入门
  6. python读压缩文件内容_使用Python读写及压缩和解压缩文件的示例
  7. 如何优雅的对列表接口进行分页?
  8. 显示菜单栏_mac菜单栏不显示了,如何设置?
  9. tostring会空指针吗_追了多年的开发框架,你还认识指针吗?
  10. 二级Access数据库大纲知识要点