一些对dp突然的理解
突然想到了一些理解,感觉有些模糊,怕忘记,就赶紧记下来
就是对于状态的设计
用01背包举例子吧,我们设计状态的时候一定是要保证所有可能在最后优秀的子状态在前面的时候是能够保留下来的
也就是我们的状态设计要能够保留那些在最后优秀但是现在可能不优秀的情况,而不是一味的追求最优子结构
所以,01背包,我们很显然是要有一个维度记录现在看到了第几个的,数组里面放的东西肯定是按所要求的答案了
dp嘛,又叫做记忆化搜索,本质是搜索的,他能够优秀的原因我的理解就是记忆化,把原本我们搜完就不用的东西给用上了
那想想,我们需要的是什么?
很明显,答案(doge)
我们需要的是能够计算出答案的情况,也就是我上面所说的状态设计的要求:保证所有可能在最后优秀的子状态在前面的时候是能够保留下来的。
这个是一个非常基础的要求,是用来保证正确性的。
我的突然的理解来自于背包在dp时把“所占空间”这个维度给放进去了。
这是一个满足了最优子结构的设计。
当到了第i个物品的时候,如果有一个选择,它所占的空间和另一个选择一样,但是它拥有的价值却更高,那毫无疑问那个价值更低的情况就一定不会被需要,无论发生什么都不会被改变
通过这种行为,我们就成功的去除了大量的无用枚举,这些枚举的特点就是,现在不优秀,而且之后也被保证不优秀。
这应该就是状态划分的一个要点:给各个情况划分标准,来判断他们的优秀程度,以此来进行一种类似剪枝的操作,来达到减少时空复杂度的目的。
我们把状态一样的情况放在一起比较,所以状态划分的要求就是:当一个情况在这个状态下不优秀时,它作为答案肯定不优秀。
这也许就是最优子结构的一种理解。
所以状态设计。。。
真的是最重要和最基础的东西,它决定了dp的复杂度。
以至于其他的所有东西都只能服于它。
我们要如何来设计一个状态呢?
首先就是上面所说的,要通过 设计可供比较的阶段 并且 保证如果现在不优,之后也可以保证不优秀 的状态,来保证正确性。
具体点就是,要找到一个能够直接决定这个状态和其他状态的区别的状态划分,就比如这个背包里面的“使用的空间”
但是这个东西如果是单一的,那就是一个简单的dp,如果不是,那就要多维的状态,以及熟练的转化问题的能力。
熟练转化问题的能力在传纸条这道题目里面有所体现 https://www.luogu.com.cn/problem/P1006
原本这是一个看起来非常不可做的复杂搜索,还有奇怪的限制条件(不能相交)
但是,通过状态的设计,我们一方面保证了最优,一方面还把条件给处理了
所以我认为这是一道好题,因为我考试遇到不会awa
我上一篇博客好像写的就是这个?
然后就是保证复杂度了。
其实就是在保证正确性的情况下寻找一个最优秀的状态。
根据我上面说的,dp的本质是记忆化搜索,我们如果要让他复杂度优秀,那通过设计一个优秀的状态来使能够进行的“剪枝”更多,能够省略的计算量更大
另一种理解其实可以是,我们通过设计更好的状态来让每一种当前最优的状态 覆盖 更多 被保证不会是答案的 非最优状态,这样,每一次转移所需的空间和寻找决策点的时间就 可能 会缩短(只是可能哦)
从我目前的理解来说,在状态设计上能够做到的应该就是这些了,其他的许多东西,也能同样做到这些,比如数据结构,斜率优化,滚动数组,等等。
但是dp嘛,最根本就两个东西,状态和转移
因为如果给了这两个东西,dp的过程就完全确定了(还能有啥呢)
而这些优化,都是从转移上下手,否则就是dp状态重来,这是前面讲的。
决策点这种东西也是在转移之中的,对于转移的优化,更多的是需要积累,虽然状态的设计也是。。
我现在目前的问题,就是不知道如何设计状态,其实就是积累的不够,还有就是,不知道dp到底能够做到什么,其实就是什么时候能用dp
这些东西,我应该是还会继续总结的。
上诉仅仅代表个人观点,如有不合,欢迎指正,希望能够与诸位一同进步!
一些对dp突然的理解的更多相关文章
- 对状压dp的一点理解
此dp可以理解为最暴力的dp,因为他需要遍历每个状态,所以将会出现2^n的情况数量,所以明显的标志就是数据不能太多(好像是<=15?),然后遍历所有状态的姿势就是用二进制来表示,01串,1表示 ...
- 区间dp暂时的理解
因为刚刚看了区间dp,所以写一下对区间dp的理解. 例题: 石子归并 51Nod - 1021 看了一篇博客,觉得他说得比较容易理解,所以再次重复一遍: 假如你是上帝,已经知道了1~n堆石子的最优解, ...
- D. Yet Another Subarray Problem 思维 难 dp更好理解
D. Yet Another Subarray Problem 这个题目很难,我比赛没有想出来,赛后又看了很久别人的代码才理解. 这个题目他们差不多是用一个滑动窗口同时枚举左端点和右端点,具体如下: ...
- 对Android中dp单位的理解
dp 设备独立像素 ,也叫dip, device independent pixle. 比如同样在1英寸大小的屏幕上,高密度的屏幕可显示100个像素点,而低密度的屏幕只能70个点. 用了dp之后,只要 ...
- dp的小理解
这段时间刷dp,总结出了一个不算套路的套路. 1.根据题意确定是否有重叠子问题,也就是前面的状态对后面的有影响,基本满足这个条件的就可以考虑用dp了. 2.确定是dp后,就是最难的部分--如何根据题意 ...
- 关于单调性优化DP算法的理解
Part1-二分栈优化DP 引入 二分栈主要用来优化满足决策单调性的DP转移式. 即我们设\(P[i]\)为\(i\)的决策点位置,那么\(P[i]\)满足单调递增的性质的DP. 由于在这种DP中,满 ...
- DP~数塔(hrbustoj1004)
aaarticlea/bmp;base64,iVBORw0KGgoAAAANSUhEUgAAAtQAAAPgCAYAAAASsev/AAAgAElEQVR4nOzdf4w0x33n9/4rQP4L8s
- 插头DP专题
建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...
- HDU1011 树形DP
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- TYVJ P1098 任务安排 Label:倒推dp 不懂
描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti.在每批任务开始前, ...
随机推荐
- 【翻译】rocksdb write stall
翻译自官方wiki:https://github.com/facebook/rocksdb/wiki/Write-Stalls 转载请注明出处:https://www.cnblogs.com/morn ...
- 使用 Sa-Token 实现不同的登录模式:单地登录、多地登录、同端互斥登录
一.需求分析 如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它可以手机电脑同时在线,但是不能在两个手机上同时登录一个账号. 同端互斥登录,指的就是:像腾讯QQ一样,在同一类型设备上只允许单地点登 ...
- 2023-07-10:Kafka如何做到消息不丢失?
2023-07-10:Kafka如何做到消息不丢失? 答案2023-07-10: Kafka采用多种机制来确保消息的不丢失,其中包括副本机制.ISR(In-Sync Replicas)机制以及ACK机 ...
- 使用Hexo搭建个人博客网站
参考CSDN上的博客.特此感谢wsmrzx.
- nf_conntrack: table full, dropping packet
参考:linux 路由跟踪表满错误 nf_conntrack: table full, dropping packet 原理解决方法 说明 ping,dmesg 或者 /var/log/message ...
- Redis持久化机制 RDB、AOF、混合持久化详解!如何选择?
本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.) Redis 持久化机制属于后端面试超高频的面试知识点,老生常谈了,需要重点花时间 ...
- 关于bzoj3306(树)的一些反思
1.加零大法好,用好没烦恼 2.不要瞎开long long 3.万物皆可变成wa 4.如果超时,试图把循环中中的东西拉到外面来
- centos转移mysql的数据存储目录
前言 centos7使用yum安装mysql的时候,没修改存储位置,/var也没单独挂载,导致长时间运行后根目录空间不足.现需要将数据转移到大分区的/home,操作步骤如下. 步骤 创建新目录 mkd ...
- Linux系统启动jmeter可视化界面
目的:方便在Linux系统调试jmeter脚本.操作:Linux启动jmeter可视化界面,不能使用root用户,需要创建新用户,切换到新用户启动jmeter. 1. 创建用户 创建一个新的系统用户. ...
- Mysql高级7-存储过程
一.介绍 存储过程是事先经过编译并存储在数据库中的一段sql语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的.存储过程思 ...