首页 > 其他分享 >一些对dp突然的理解

一些对dp突然的理解

时间:2023-10-11 20:11:08浏览次数:35  
标签:状态 优秀 理解 保证 就是 突然 设计 dp

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

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

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

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

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

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


然后就是保证复杂度了。

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

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

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

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

 

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

标签:状态,优秀,理解,保证,就是,突然,设计,dp
From: https://www.cnblogs.com/HLZZPawa/p/17757878.html

相关文章

  • 《算法学习专栏》—— DP问题之背包模型
    2023年10月11日更新于2023年10月11日一、前言本栏,为背包模型,题目主要来源日常,目前主要来源于Acwing的提高课。希望以后做到背包的题目,也能加进来,不断完善。使用的分析方法均为闫式DP分析法。字臭。。。希望能用手写板慢慢写的好看。二、背包模型2.1目前的模型01背包模型......
  • 软件测试|深入理解SQL RIGHT JOIN:语法、用法及示例解析
    引言在SQL中,JOIN是一种重要的操作,用于将两个或多个表中的数据关联在一起。SQL提供了多种JOIN类型,其中之一是RIGHTJOIN。RIGHTJOIN用于从右表中选择所有记录,并将其与左表中匹配的记录组合在一起。本文将深入探讨SQLRIGHTJOIN的语法、用法以及通过实例解析来说明其作用。RIGH......
  • 软件测试|深入理解SQL FULL JOIN:语法、用法及示例解析
    简介在SQL中,JOIN是一个强大的操作,它允许将两个或多个表中的数据进行关联。SQL提供了多种JOIN类型,其中之一是FULLJOIN。FULLJOIN允许从左表和右表中选择所有记录,并将它们组合在一起。本文将深入探讨SQLFULLJOIN的语法、用法,并通过实例解析来说明其作用。FULLJOIN基本语法......
  • C++ - UDP通信
    1.UDP通信流程UDP就比较简单了,步骤比tcp要少一些。连接过程图:  1.1服务器1.初始化套接字库WORDwVersion;WSADATAwsaData;interr;​wVersion=MAKEWORD(1,1);2.创建套接字SOCKETsockSrv=socket(AF_INET,SOCK_DGRAM,0);3.绑定//SOCKADDR_INaddrSrv......
  • 智慧安防视频监控系统EasyCVR平台突然运行异常,是什么原因?
    随着互联网技术的发展与视频技术的进步,视频监控系统EasyCVR安防视频综合管理平台支持多类型设备、多协议方式接入,包括市场主流标准协议国标GB28181、RTMP、RTSP/Onvif协议等,以及厂家私有协议,如海康SDK、大华SDK、海康Ehome等。平台可兼容市面上绝大多数品牌的视频源设备,对外可分发......
  • DPDK-22.11.2 [四] Virtio_user as Exception Path
    因为dpdk是把网卡操作全部拿到用户层,与原生系统驱动不再兼容,所以被dpdk接管的网卡从系统层面(ipa/ifconfig)无法看到,同样数据也不再经过系统内核。如果想把数据再发送到系统,就要用到virtiouser。这种把数据从dpdk再发送到内核的步骤,就叫做exceptionpath。有关virtiouser,又有一......
  • WordPress网站被黑怎么办?【含解决方案】
    在我们的日常WordPress主题售后工作中,经常会有用户反馈网站出现问题,例如:阿里云提示后门木马文件;打开后跳转到其他地址;页面出现乱码;被添加了其他内容等,根据我们的经验,这种一般都是网站被黑导致的。 如何确认网站是否被黑根据以往经验,可以通过以下方式来判断:1、如果是阿里云提......
  • Flex布局的三个属性要深刻理解!
    在我们日常开发中,flex布局可以说是家常便饭,对于很多的我们来说(你懂得^_^),可能我们用的比较多的应该就是垂直居中里,也就是下面这段代码:.flex-box{display:flex;justify-content:center;align-items:center;}写的非常好(^_^)!然后我们都知道这个是定义在父元素的,布局效果是......
  • 【面试题】说说你对 async和await 理解
    asyncawait详解原理:async声明该函数是异步的,且该函数会返回一个promise。await必须放在async函数中使用await+Promise这是最常见的场景,await会等待Promise的状态改为fullfilled,如果成功,那么会将async函数剩余任务推入到微任务队列,如果失败,那么剩余任务不会被推入微任务队列执行,它......
  • 前端进阶系列——理解 React Ref
    前端进阶系列——理解ReactRef秦书羽杭州@朝夕光年​关注他 17人赞同了该文章Ref是Reference(引用)的缩写。一、前言在React中通常遵循“自上而下”的“单向数据流”。父组件和子组件的通讯只能通过Props。如果要修改一个子组件,我们要修改......