一些对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.在每批任务开始前, ...
随机推荐
- Python编程和数据科学中的人工智能:如何创建复杂的智能系统并提高模型性能
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 标题:<Python编程和数据科学中的人工智能:如何创建复杂的智能系统并提高模型性能> 1. 引 ...
- GPT3的性能评估:比较不同语言、文本和任务的差异
目录 GPT-3 性能评估:比较不同语言.文本和任务的差异 近年来,自然语言处理 (NLP) 和人工智能领域取得了巨大的进展,其中 GPT-3 是目前最为先进的语言模型之一.GPT-3 拥有超过 17 ...
- 驱动开发:应用DeviceIoContro模板精讲
在笔者上一篇文章<驱动开发:应用DeviceIoContro开发模板>简单为大家介绍了如何使用DeviceIoContro模板快速创建一个驱动开发通信案例,但是该案例过于简单也无法独立加载 ...
- 堆栈式 CMOS、背照式 CMOS 和传统 CMOS 传感器的区别
光电效应 光电效应的现象是赫兹(频率的单位就是以他命名的)发现的,但是是爱因斯坦正确解释的.简单说,光或某一些电磁波,照射在某些光敏物质会产生电子,这就是光电效应. 这就将光变为了电,光信号的改变会带 ...
- 【原创】Ftrace使用及实现机制
Ftrace使用及实现机制 版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正. 目录 Ftrace使用及实现机制 ...
- Avalonia 使用EFCore调用SQLite实现Singleton全局注册
Avalonia 使用EFCore调用SQLite实现Singleton全局注册 本篇博客是我的开源项目TerraMours.Chat.Ava的更新的记录分享,本次更新使用EntityFrameWor ...
- 关于"覆盖问题”的反思
[HAOI2007]覆盖问题 题目描述 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定 用3个L*L的 ...
- React: 路由重定向
解决方案 参考链接 https://v5.reactrouter.com/web/example/route-config
- Git练习网址
爲了方便学习git指令,让新手们更容易地理解,所以推荐一些git练习和博文网址 推荐的网址如下 网址一:Learn Git Branching! https://learngitbranching.j ...
- Unity的IPreprocessShaders:深入解析与实用案例
Unity IPreprocessShaders Unity IPreprocessShaders是Unity引擎中的一个非常有用的功能,它可以让开发者在编译Shader时自定义哪些操作需要被执行.这 ...