一些对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.在每批任务开始前, ...
随机推荐
- GPT3的应用领域:机器翻译、文本生成、文本摘要
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 4. 应用示例与代码实现讲解 4.1 机器翻译 4.2 文 ...
- 微信小程序常用的view、text、button、image组件
[黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)] https://www.bilibili.com/video/BV1834y1676 ...
- Batch Normalization及其反向传播及bn层的作用
笔记: Batch Normalization及其反向传播 重点: 在神经网络中,网络是分层的,可以把每一层视为一个单独的分类器,将一个网络看成分类器的串联.这就意味着,在训练过程中,随着某一层分类器 ...
- CF1829H Don't Blame Me题解
题意: 给定一个长度为 \(n\) 的数组,选择它的一个子序列(不一定要连续的),问有多少种选法使得它们 AND 的值的二进制表示法中有 \(k\) 个 \(1\). 思路: 这个题就是一个简单的 D ...
- go build怎么使用
go build 是 Go 语言编译器的一个命令,用于将 Go 源代码文件编译成可执行的二进制文件.它是 Go 语言开发过程中常用的一个命令.以下是 go build 的基本使用方法: go buil ...
- pandas:字典转dataframe的注意事项
推荐写法 参考链接 https://blog.csdn.net/u013061183/article/details/79497254
- 【Unity3D】高斯模糊特效
1 高斯模糊原理 边缘检测特效中使用了卷积运算进行了边缘检测,本文实现的高斯模糊特效同样使用了卷积运算,关于卷积核和卷积运算的概念,读者可以参考边缘检测特效. 本文完整资源见→Unity3D高 ...
- Java BigDecimal 分析
1.使用理由: Double类和Float类可以对16位有效数字的数进行精确运算,但对于超过16位有效数字的数,会丢失精度.所以使用BigDecimal类来精确计算超过16位有效数字的数. 2.引入包 ...
- 10、Mybatis之缓存
10.1.环境搭建 10.1.1.创建新module 创建名为mybatis_cache的新module,过程参考5.1节 10.1.2.创建Mapper接口和映射文件 package org.rai ...
- linux 查找目录中的大文件
find是Linux系统中常用的文件查找命令.它可以在文件系统中查找指定条件的文件,并执行相应的操作.语法格式如下: find [pathname] [options] pathname: 指定查找的 ...