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

动态规划 总结

时间:2024-08-18 23:48:16浏览次数:14  
标签:总结 状态 取值 复杂度 搜索 记忆 动态 规划 DP

DAG上的动态规划与树形DP这两个词看上去很高大上,但实则就是记忆化搜索,而记忆化搜索其实就是DP的本质。当选择一个需要用全局变量来参与描述状态的方式时,就只能用常规搜索。但当状态可以完全被几个非全局参数确定性的描述时,就可以用记忆化搜索,记忆化搜索可以通过存储答案并直接提取来大大减少时间复杂度,可见重复状态越多、则记忆化搜索所带来的优化就越大,而当状态完全不重复时,记忆化搜索就退化成了最朴素的搜索,且无法使用全局变量的限制还凭空增加了思维复杂度,显然不划算。因此,我们只有会使用有意义的记忆化搜索,即因重复状态较多而可以带来较大优化的记忆化搜索。特别的,我们为这种记忆化搜索起一个好听的名字,这便是动态规划。

动态规划的核心在于用几个参数完全且确定地刻画某一个状态,然后依照状态间的关系进行记忆化搜索,特别的,因为动态规划的状态完全有几个参数表示,DP的状态因而可以被写在一个表格、一个长方体、或任何n维体上,且状态间的关系具有单调性,这使得我们可以按照一个较为简单的规则而非按照搜索的自然顺序来进行计算,且可以保证虽然并未按搜索的自然顺序来计算,但任何状态在他被用到之前都一定已经算好了,也就是说保证了结果的不变性。这种简单的规则通常是按行按列的填表法,或者其他能被几个循环简单描述的填表法,总之这种简单的规则太过于普遍的能够出现,且可以转递归为循环省去了栈空间,因而被广泛应用,甚至倒反天罡让初学者误以为这才是DP的自然形态,使得初学者无法意识到DP的本质因而极难真正理解DP。尽管如此,递推式DP确实好用,因而我们下文在DAG上的DP与树形DP这两个传统记搜领域以外,都将全部采用递推式DP来分析,不过学习者要始终记得DP的本质及递推式DP这种方式的本质。

背包DP,其实算不上是一种DP,只是为了解决背包问题而单独画出来的一个门类,实则就是用多个参数来刻画状态并递推式地进行状态转移。

区间DP,其实只是一种特殊的二维DP,两个维度分别表示要描述的区间的左右端点,DP值则是描述该区间某性质的一个量值

 

当DP函数的取值只有0和1时,或其他取值范围很小的时候,我们要时刻记住DP的取值实则就是免费赠与我们的一个维度,即二维DP实则可以描述一个三维逻辑空间中的状态,因为两个参数加一个DP值正好三维,可二维DP的时间复杂度却只取决于两个参数,不取决于DP值。因而DP值可以理解为免费额度,从占小便宜的角度来想,我们要尽可能的利用免费额度多占便宜,真要花自己钱的时候则要尽量节省。因此当DP函数的取值只有0和1时,或其他取值范围很小的时候,我们就要将DP值和某一个取值范围很大的维度的参数相调换,这样就几乎可以减去一个维度的时间复杂度,从而实现类似立方时间复杂度的算法化简为平方时间复杂度一类的操作

标签:总结,状态,取值,复杂度,搜索,记忆,动态,规划,DP
From: https://www.cnblogs.com/gongkai/p/18366409

相关文章

  • 动态创建表
    部分场景需要动态创建表,例如根据用户输入的表名动态创建。动态创建表可以使用xml方式来实现,具体步骤如下:1、service层:中调用mapper里的createTable方法itemMapper.createItemTable(tableName,VARCHAR_256);2、DAO层:mapper中写具体的创建方法createItemTable@Mapper......
  • Hadoop 第六周总结
    在Hadoop学习的第六周,你可能会收获以下关键知识点:YARN(YetAnotherResourceNegotiator):YARN是Hadoop的资源管理和作业调度系统。本周你可能深入了解了YARN的架构及其组件,包括ResourceManager和NodeManager。ResourceManager负责全局资源调度和作业调度,而NodeManag......
  • 2024.8.18 周总结(上周天到这周六集训,这周天放假)
    感觉这一周上难度了,尤其没听懂的是二分图和博弈论那天上午休息完之后的部分。有复习,有新知识,收获还是比较大的。晚上打游戏打多了。文化课没学多少。中午看番、玩寝室楼下桌上的游戏去了,因为寝室要关灯拉窗帘睡得也更早,一周就只写了一点点字帖,看了一点点《乡土中国》。综......
  • 【代码随想录训练营第42期 Day32打卡 - 从零开始动态规划 - LeetCode 509. 斐波那契数
    目录一、做题心得二、动规五步走三、题目与题解题目一:509.斐波那契数题目链接题解1:记忆性递归 题解2:动态规划题目二:70.爬楼梯 题目链接题解:动态规划题目三:746.使用最小花费爬楼梯题目链接题解:动态规划三、小结一、做题心得今天开始动态规划章节的第一......
  • Mybatis学习日记-day7-动态sql
    一、学习目标        在之前的学习中,使用的都是静态sql,而动态SQL相比静态SQL具有多个显著的优点。    首先。,动态SQL允许根据程序运行时的条件和需求来动态地生成SQL语句。这意味着它可以根据不同的情境和需求生成不同的SQL语句,从而提供更高的灵活性和适应......
  • P10660 BZOJ2759 一个动态树好题 题解
    从题目名字看出此题需要用动态树解决对于任意\(i\),都有唯一的\(p_i\)与之对应,由\(p_i\)向\(i\)连边,\(n\)种关系显然构成一基环树森林。对于环上的节点,一个点可以自己表示自己,所以可以直接解出该点的权值,其他点从环上的点直接推出即可。考虑如何动态维护这个过程,一个点上......
  • 虚树总结
    之前学了一些算法,没有写算法总结,未来会陆续补一些。前置知识:树形\(dp\),\(lca\),\(dfs\)序。我们考虑\([HEOI2014]\)大工程这道题。显而易见,假如这道题只有一次询问,我们可以直接树形\(dp\),快速求出答案,时间复杂度\(O(n)\)。但是,梦想是梦想,现实是现实,这题多组询问,假如一......
  • (nice!!!)LeetCode 552. 学生出勤记录 II(动态规划dp递归版、记忆化dfs)
    题目:552.学生出勤记录II思路:记忆化搜索dfs,细节看注释classSolution{public:constintmod=1e9+7;//状态f[u][a][b]表示:在选择第u个位置前,缺勤次数为a次,且当前连续迟到次数为b次时,可以得到的合法出勤次数intf[100010][5][5];intdfs(intu,int......
  • 第七周总结
    深入并发编程鉴于并发编程在现代软件开发中的重要性,本周我投入了大量时间深入学习了Java的并发编程模型。除了复习之前学过的线程基础、同步机制(如synchronized、volatile、wait/notify)外,我还重点学习了Java并发包(java.util.concurrent)中的高级并发工具,如ExecutorService、Futu......
  • 【JavaSec】JDK动态代理初探
    JDK动态代理初探文章目录JDK动态代理初探静态代理动态代理静态代理用户接口:publicinterfaceIUser{voidshow();voidcreate();voidupdate();}用户实现类:/***实现类*/publicclassUserImplimplementsIUser{publicUserI......