首页 > 其他分享 >刷题总结——动态规划

刷题总结——动态规划

时间:2024-11-06 22:33:27浏览次数:3  
标签:总结 max 复杂度 不选 选与 动态 优化 dp 刷题

总论

怎么求解?

  • 回溯
  • 记忆化搜索
  • 递推(方便进行空间复杂度优化)

求什么?

  • 方案数
  • 最大值
  • 最小值

状态方程

对应关系:

  • 转移状态的定义(回溯入口)
  • 边界条件(边界状态如何递推得到其实状态,回溯的终止条件)
  • 如果递推公式是求最小,边界初始化成INT_MAX_ * 如果递推公式求最大,边界为0或1
  • 如果是乘法,需要处理负数正数两种状态
  • 取一个特例: 从单个元素角度看一下
空间复杂度优化
  • O(mn)->O(n) 滚动数组,注意方向
  • O(mn)->O(1) 单个变量记录状态

分类

分类 递推公式 边界条件 备注
爬楼梯(方案数) dp(i) = dp(i-1) + dp(i-2) 起始位置f(0), f(1), f(2) O(n), 加法原理+取余
打家劫舍(选与不选) dp(i) = max(dp(i-1), + dp(i-2)+value[i-1]) 起始位置 O(n), 选与不选
最大子数组和(选与不选) dp(i) = max(nums(i), dp(i-1)+nums(i-1)); 无需处理 Kadane算法,还有前缀和做法(滑动窗口找当前前缀和减当前最小前缀和)
网格dp dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + frame[i-1][j-1]; 起始位置+最左和最上的边界 O(n)(m),通常是2D网格,注意空间优化
0-1背包(选与不选) dp[i] = max(dp[i-1][c], dp[i-1][c-w[i]]+v[i]) 起始位置与默认值 O(n)(value), 空间复杂度优化
完全背包(选与不选) dp[i] = max(dp[i-1][c], dp[i][c-w[i]]+v[i]) 起始位置与默认值 O(n)(value), 空间复杂度优化
多重/分组背包(选几次) dp[i] = \sum{dp[i-1][j-v*i]} for i=1..k 起始位置dp(0)(0)=1默认值0 O(n)(value),同一物品可选k次,空间复杂度与其他背包一样,多重背包k在外面,分组k在里面
线性序列dp (LCS, LIS问题,2个字符串s1(:i), s2(:j)的关系) dp[i][j] = max(dp[i-1][j], dp[i][j-1]); 边界条件多1行1列,初始值受问题影响 O(m)(n), 一般是在数组前缀和后缀上转移的,空间复杂度优化
状态机dp f[i][j]为第i天在j状态下,需要与i-1天建立联系,如股票买卖 边界条件,可能为-∞ O(n), 画状态图,适合dfs
划分型dp
区间dp dp[i][j]=dp[i+1]dp[j-1]+2;``dp[i][j]=max(dp[i+1][j], dp[i][j-1]) 边界条件主要是允许区间越界的地方如何表示(上三角矩阵),和循环变量增长的方向。 O(m)(n), 从小区间转移到大区间

最长递增子序列LIS问题的优化

  • 从O(n2)到O(n),思路:交换状态与状态值
    • O(n2): 状态是以i为结尾元素的LIS的长度
    • O(n): 状态是长度为i+1的序列里面构成的上升子序列结尾元素最小值(最小值,才有机会扩展序列)贪心+二分
      注意此时记录的额外空间g(n)不是子序列

带特殊数据结构的DP

  • 前缀和优化
  • 单调栈优化
  • 单调队列优化
  • 树状数组优化

参考资料

  1. https://leetcode.cn/circle/discuss/tXLS3i/

标签:总结,max,复杂度,不选,选与,动态,优化,dp,刷题
From: https://www.cnblogs.com/hesun/p/18531180

相关文章

  • 【真题笔记】17年系统架构设计师要点总结
    【真题笔记】17年系统架构设计师要点总结流水线吞吐率加速比DMA(直接存储器访问)CISC(复杂指令系统计算机)+RISC(精简指令系统计算机)网络规划与设计逻辑网络设计物理网络设计信息化需求需求管理过程瀑布模式软件过程模型IDL(接口定义语言)系统移植体系结构文档化过程......
  • 常见的Kubernetes面试题总结
    常见的Kubernetes面试题总结1、简述etcd及其特点etcd是CoreOS团队发起的开源项目,是一个管理配置信息和服务发现(servicediscovery)的项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于Go语言实现。特点:简单:支持REST风格的HTTP+JSONAPI安全:支持HTTPS方式的访问......
  • 2024年11月6日总结
    今天javaWeb只看了这些内容,MySQL已经准备在重新下载安装了。DQL查询表:select 字段列表from 表名列表where 条件列表groupby 分组字段having 分组后条件orderby 排序字段exampleSELECTxxxFROMxxx去除重复记录:SELECTDISTINCT(去重关键词)xxas别名(这里给xx起了个......
  • Proteus中数码管动态扫描显示不全(已解决)
    前言我是直接把以前写的51数码管程序复制过来的,当时看的郭天祥的视频,先送段选,消隐后送位选,最后来个1ms的延时。代码在Proteus中数码管静态是可以的,动态显示出了问题——显示不全,我在网上搜的说是Proteus的Bug,需要先送位选再送段选,我试了试也不行。最后在我多次实验下......
  • NOIP2024 模拟赛 #15 总结
    Larunatrecy:信心赛。赛时T1求中位数,想起前两天做过的[ABC203D]Pond,考虑了二分答案。看出二分答案后不会做了,罚坐\(20\)min。然后发现我傻逼了,选出一个区间翻转,可以通过钦定右端点,找到最优的左端点得到,神仙Heldivis就出过一道这样的题。写完后调了下二分边界过了大样......
  • SQL语法基础知识总结
    SQL(StructuredQueryLanguage)即结构化查询语言,是用于管理关系型数据库的标准语言。掌握SQL语法是操作数据库的关键,以下是SQL语法基础知识的详细总结。一、数据定义语言(DDL-DataDefinitionLanguage)1.创建数据库(CREATEDATABASE)用于创建一个新的数据库。例如,创建一......
  • Linux 基础知识总结
    简介Linux是一个开源的类Unix操作系统内核,由LinusTorvalds在1991年首次发布。如今,Linux已经发展成为一个庞大的操作系统家族,广泛应用于服务器、桌面、移动设备和嵌入式系统等多个领域。本文将为你提供一个关于Linux的基础知识总结,帮助你快速了解和掌握Linux的核心......
  • 经典算法思想总结
    在计算机科学的世界里,算法是解决问题的核心工具。它们不仅定义了如何解决问题,还决定了解决问题的效率。以下是一些经典算法思想的总结,这些思想跨越了多个领域,从数据结构到机器学习,都是构建高效算法的基石。1.分治法(DivideandConquer)分治法是一种将问题分解成更小的子问......
  • 数据库基础知识总结
    一、数据库简介数据库是按照数据结构来组织、存储和管理数据的仓库。它就像是一个精心设计的文件柜,用于存放海量的数据信息,并且能够方便地对这些数据进行操作和检索。在当今数字化的时代,数据库在各个领域都有着至关重要的作用,无论是企业的资源管理、互联网应用的数据存储,还是......
  • Vue项目中动态路由与权限控制:router.beforeEach的使用及无token重定向登录页
    在现代前端项目中,权限控制是一个非常重要的环节。VueRouter作为Vue官方的路由管理器,为我们提供了强大的路由管理功能。在本文中,我们将探讨如何在Vue项目中使用router.beforeEach钩子函数来实现动态路由权限控制,并在用户未登录时自动重定向到登录页。步骤一:登录并获取Token首......