突然想到了一些理解,感觉有些模糊,怕忘记,就赶紧记下来
就是对于状态的设计

用01背包举例子吧,我们设计状态的时候一定是要保证所有可能在最后优秀的子状态在前面的时候是能够保留下来的
也就是我们的状态设计要能够保留那些在最后优秀但是现在可能不优秀的情况,而不是一味的追求最优子结构
所以,01背包,我们很显然是要有一个维度记录现在看到了第几个的,数组里面放的东西肯定是按所要求的答案了
dp嘛,又叫做记忆化搜索,本质是搜索的,他能够优秀的原因我的理解就是记忆化,把原本我们搜完就不用的东西给用上了
那想想,我们需要的是什么?
很明显,答案(doge)
我们需要的是能够计算出答案的情况,也就是我上面所说的状态设计的要求:保证所有可能在最后优秀的子状态在前面的时候是能够保留下来的。
这个是一个非常基础的要求,是用来保证正确性的。

我的突然的理解来自于背包在dp时把“所占空间”这个维度给放进去了。
这是一个满足了最优子结构的设计。
当到了第i个物品的时候,如果有一个选择,它所占的空间和另一个选择一样,但是它拥有的价值却更高,那毫无疑问那个价值更低的情况就一定不会被需要,无论发生什么都不会被改变
通过这种行为,我们就成功的去除了大量的无用枚举,这些枚举的特点就是,现在不优秀,而且之后也被保证不优秀。
这应该就是状态划分的一个要点:给各个情况划分标准,来判断他们的优秀程度,以此来进行一种类似剪枝的操作,来达到减少时空复杂度的目的。
我们把状态一样的情况放在一起比较,所以状态划分的要求就是:当一个情况在这个状态下不优秀时,它作为答案肯定不优秀。
这也许就是最优子结构的一种理解。

所以状态设计。。。
真的是最重要和最基础的东西,它决定了dp的复杂度。
以至于其他的所有东西都只能服于它。

我们要如何来设计一个状态呢?

首先就是上面所说的,要通过 设计可供比较的阶段 并且 保证如果现在不优,之后也可以保证不优秀 的状态,来保证正确性。
具体点就是,要找到一个能够直接决定这个状态和其他状态的区别的状态划分,就比如这个背包里面的“使用的空间”
但是这个东西如果是单一的,那就是一个简单的dp,如果不是,那就要多维的状态,以及熟练的转化问题的能力。
熟练转化问题的能力在传纸条这道题目里面有所体现    https://www.luogu.com.cn/problem/P1006
原本这是一个看起来非常不可做的复杂搜索,还有奇怪的限制条件(不能相交)
但是,通过状态的设计,我们一方面保证了最优,一方面还把条件给处理了
所以我认为这是一道好题,因为我考试遇到不会awa
我上一篇博客好像写的就是这个?

然后就是保证复杂度了。

其实就是在保证正确性的情况下寻找一个最优秀的状态。
根据我上面说的,dp的本质是记忆化搜索,我们如果要让他复杂度优秀,那通过设计一个优秀的状态来使能够进行的“剪枝”更多,能够省略的计算量更大
另一种理解其实可以是,我们通过设计更好的状态来让每一种当前最优的状态  覆盖  更多  被保证不会是答案的   非最优状态,这样,每一次转移所需的空间和寻找决策点的时间就  可能  会缩短(只是可能哦)

从我目前的理解来说,在状态设计上能够做到的应该就是这些了,其他的许多东西,也能同样做到这些,比如数据结构,斜率优化,滚动数组,等等。
但是dp嘛,最根本就两个东西,状态和转移
因为如果给了这两个东西,dp的过程就完全确定了(还能有啥呢)
而这些优化,都是从转移上下手,否则就是dp状态重来,这是前面讲的。
决策点这种东西也是在转移之中的,对于转移的优化,更多的是需要积累,虽然状态的设计也是。。

我现在目前的问题,就是不知道如何设计状态,其实就是积累的不够,还有就是,不知道dp到底能够做到什么,其实就是什么时候能用dp

这些东西,我应该是还会继续总结的。

上诉仅仅代表个人观点,如有不合,欢迎指正,希望能够与诸位一同进步!

一些对dp突然的理解的更多相关文章

  1. 对状压dp的一点理解

     此dp可以理解为最暴力的dp,因为他需要遍历每个状态,所以将会出现2^n的情况数量,所以明显的标志就是数据不能太多(好像是<=15?),然后遍历所有状态的姿势就是用二进制来表示,01串,1表示 ...

  2. 区间dp暂时的理解

    因为刚刚看了区间dp,所以写一下对区间dp的理解. 例题: 石子归并 51Nod - 1021 看了一篇博客,觉得他说得比较容易理解,所以再次重复一遍: 假如你是上帝,已经知道了1~n堆石子的最优解, ...

  3. D. Yet Another Subarray Problem 思维 难 dp更好理解

    D. Yet Another Subarray Problem 这个题目很难,我比赛没有想出来,赛后又看了很久别人的代码才理解. 这个题目他们差不多是用一个滑动窗口同时枚举左端点和右端点,具体如下: ...

  4. 对Android中dp单位的理解

    dp 设备独立像素 ,也叫dip, device independent pixle. 比如同样在1英寸大小的屏幕上,高密度的屏幕可显示100个像素点,而低密度的屏幕只能70个点. 用了dp之后,只要 ...

  5. dp的小理解

    这段时间刷dp,总结出了一个不算套路的套路. 1.根据题意确定是否有重叠子问题,也就是前面的状态对后面的有影响,基本满足这个条件的就可以考虑用dp了. 2.确定是dp后,就是最难的部分--如何根据题意 ...

  6. 关于单调性优化DP算法的理解

    Part1-二分栈优化DP 引入 二分栈主要用来优化满足决策单调性的DP转移式. 即我们设\(P[i]\)为\(i\)的决策点位置,那么\(P[i]\)满足单调递增的性质的DP. 由于在这种DP中,满 ...

  7. DP~数塔(hrbustoj1004)

    aaarticlea/bmp;base64,iVBORw0KGgoAAAANSUhEUgAAAtQAAAPgCAYAAAASsev/AAAgAElEQVR4nOzdf4w0x33n9/4rQP4L8s

  8. 插头DP专题

    建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...

  9. HDU1011 树形DP

    Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  10. TYVJ P1098 任务安排 Label:倒推dp 不懂

    描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti.在每批任务开始前, ...

随机推荐

  1. 基于生成式预训练Transformer的跨语言文本摘要与情感分析

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成 ...

  2. Nginx+php关联

    nginx配置php选项,解除对IIS.Apache的php环境依赖 php.ini配置 取消extension_dir注释 取消cgi.fix_pathinfo注释 nginx.conf配置 取消 ...

  3. Android实时获取摄像头画面传输至PC端

    前言 最近在做一个PC端小应用,需要获取摄像头画面,但是电脑摄像头像素太低,而且位置调整不方便,又不想为此单独买个摄像头.于是想起了之前淘汰掉的手机,成像质量还是杠杠的,能不能把手机摄像头连接到电脑上 ...

  4. 【Jenkins】 GitLab Gitee GitHub 部署

    Jenkins GitLab Gitee GitHub 部署 环境 Jenkins Git Maven Jenkins 部署可参考文章:https://www.cnblogs.com/cxt618/p ...

  5. Hexo博客Next主题建立标签云hexo-tag-cloud及效果展示

    hexo-tag-cloud插件介绍 hexo-tag-cloud插件是作者写的一个Hexo博客的标签云插件,旨在直观的展示标签的种类,美观大方且非常优雅. 插件地址: 插件的GitHub地址 插件说 ...

  6. opencv-python中 boundingRect(cnt)以及cv2.rectangle用法

    矩形边框(Bounding Rectangle)是说,用一个最小的矩形,把找到的形状包起来.还有一个带旋转的矩形,面积会更小,效果见下图 首先介绍下cv2.boundingRect(img)这个函数 ...

  7. CSS:使用透明色

    使用如下代码: background-color="#00000000"

  8. Mysql 统计标签出现次数(一行变多行)

    需求背景 需求 一张数据表 其中有sid字段,代表tag,每行数据可能有多个tag字段 统计全量数据中所有tag出现的次数(按tag分组,分别有多少数据) source table demo id s ...

  9. 【go笔记】标准库-strconv

    前言 标准库strconv提供了字符串类型与其他常用数据类型之间的转换. strconv.FormatX()用于X类型转字符串,如strconv.FormatFloat()用于浮点型转字符串. str ...

  10. Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs

    目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明 Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改 Hi3798MV200 恩兔N2 NS ...