什么是真正的dp?有什么特点?怎么来搞。

最近遇到了一些以前的题目发现没有好好的理解就直接写了 大多都是书上的算法并不是自己真正的理解。

1 关于背包 我总结一下 可能 有助于对模型的更快发现

01 背包 一般来说直接使用一个维度直接继承上一层的状态 对于每一个状态我们可以保证其实最优的所以具有最优子结构所以 是正确的。

完全背包 一个物品无限使用所以我们只需要能使用就使用即可不需要管数量。

多重背包 我们把状态转移写出来 其实第一次我是这样做的 把多重背包换成01背包的模型然后复杂度 nmci 非常之高,但是换成一个更先进的状态转移。

发现每一段都是连续的转移 求某个区间的最大值 直接单调队列就优化了。二进制拆分好久没用了 其实就是分成logn个 然后01背包的选取即可,根据二进制的拆分所以正确性是显然的。

这里有一个比较 有创造性的题目。

一眼 多重背包单调队列优化 但是其实我们发现问题的本质是 求某个区间是否有一个1 这样也可以进行前缀和的优化。

但是皆因常数有点大T掉了。再次考虑优化 我们发现 只是求 一段区间中离我们当前值最近的一个1即可。

虽然可能较远的1也可以使用但是 从贪心角度来看 取最近的1给后面带来的决策更优 于是我们把倒着的过程优化到了正着的过程。

于是 根据贪心的最优性我们成把两倍常数卡到了一倍常数通过了此题。

分组背包?怎么做?一组中只能选取一个 更实际一点的是 对于一个j来说 我们只会选择一个物品 由于是01背包 那么倒着选 然后内层循环 循环物品即可。

多人背包?背包的第k优解 怎么办?设状态 f[i][j] 表示 对于容量为 i 的第j优解 考虑转移 这里考虑刷表法 然后 转移到 某某状态 发现了么 对于同一个i来说 j增大的时候 f数组单调不增 所以 可以直接归并的完成这个过程。

考虑一些难一些的dp 如 需要优化状态 优化空间 优化转移 ...其中我认为优化状态是最难的 我 基本上就是一个状态想半天 而题解中的状态却设计的 非常的精巧。

接下来讨论一道 对dp的深刻理解的题目。

LINK:the heart of the tree 一句话题意 Q次询问每次询问某个点为根的子树内的重心。

关于重心有一些比较好的性质 但是 我的点分树学艺不精 所以 知道的不多。

n 和 Q的数量级都到达了 3e5的数量级 暴力显然不行。我们至少要再logn的时间内求出答案 我曾想过线段树维护dfs序然后进行区间的操作。发现不太行

考虑 一遍dfs序求出所有点的重心 从子树往上走必然的结果是 此时的重心一定不会往里面跳一定会往上面跳所以 考虑所有的重心向上跳的数量级是O(n)的 直接向上跳即可。

题解中海油 更 有趣的思路是 抱歉没有了我觉得并不优秀。核心思想都差不多。

数位dp 这种dp省选之中经常出现 我没有过人的天赋 我也没有出众的才能只能利用自己的 头硬写..

首先是 状态要合适 然后是 状态数量要在可控范围内 转移的时候要注意一些细节 如最高位的限制 及 前导0是否存在。

此时转移 无非就是枚举决策 当前数位填什么qwq... 乌拉前导0 也是可以放到状态之中的和普通的状态不一样 值得注意的是

前导0的情况有9*(n-1)种 其中n是数位的个数 其实这个放不放到状态中都是无所谓的了 如果觉得不好写那就放到状态中 状态中如果没有亲自开设一个位置给前导0的一系列状态的话也不能强行放到f数组中。

具体的dp细节就是这样了。关键是  状态 状态的数量 及 转移的 细节。

值得一提的是 进行记忆化搜索的retunrn 时注意判断limt的限制是否存在(如果存在自然不能return 我忽略了这一点在不经意间qwq。

update : 数位dp 统计一个区间之内的 符合某种特点的 数字个数 具有多种特点的时候考虑拆分 一个一个求。

这里我觉得有两个类似于相似但不相同的 问题。

1:给出一个区间求这个区间中 1-9 分别出现了多少次。

2:给出一个区间求这个区间中每个数字的数位和?

转换模型 2问题是1问题的子集。$ans2=\sum_{i=1}^{9} ans[i]*i;$

其中 1问题我在求解的时候非常之迷.2问题反而好求一点但复杂度较高

以此我分类讨论 来阐明 数位dp的本质. 数位dp的本质和状态dp的本质一样 状态合并 大大降低复杂度。

考虑第二个问题 如何 解决 考虑 每个数字 的数位之和 是很小的数字 我们将这相同的状态进行合并 然后数位dp即可。

每次f数组表示在某某情况下的 目标和是i的方案数即可。

考虑第一个问题 把问题拉向另一个方向 发现一个数字出现的是1 ~ 9 才对答案有贡献 求某个区间中某个数字出现了多少次 这个显然 也是求某一类有特点的数字 并非多类 也没有限制当前数字要有多少个

所以 从这一方面考虑状态数量从原本的 位数*9 变到了 9 大大降低了复杂度.

两种方法都通过此题 且 第一种方法比第二种方法不知道快到哪里去了qwq

dp的本质的更多相关文章

  1. android dp深度解析(转)

    我转载地方的连接:http://zhangkun716717-126-com.iteye.com/blog/1772696  当笔记记录一下 dip: device independent pixel ...

  2. 2331: [SCOI2011]地板 插头DP

    国际惯例的题面:十分显然的插头DP.由于R*C<=100,所以min(R,C)<=10,然后就可以愉悦地状压啦.我们用三进制状压,0表示没有插头,1表示有一个必须延伸至少一格且拐弯的插头, ...

  3. 斜率优化DP学习笔记

    先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...

  4. 【BZOJ1093】【ZJOI2007】最大半联通子图 [DP][Tarjan]

    最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 一个有向图G=(V,E)称为 ...

  5. hdu 1257 最少拦截系统【贪心 || DP——LIS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  6. 省选算法学习-插头dp

    插头dp?你说的是这个吗? 好吧显然不是...... 所谓插头dp,实际上是“基于连通性的状态压缩dp”的简称,最先出现在cdq的论文里面 本篇博客致力于通过几道小小的例题(大部分都比较浅显)来介绍一 ...

  7. 数位dp真·浅谈 By cellur925

    预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...

  8. loj6171/bzoj4899 记忆的轮廊(期望dp+优化)

    题目: https://loj.ac/problem/6171 分析: 设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数 那么 a[ ...

  9. 初学数位DP

    所谓数位dp,字面意思就是在数位上进行dp,数位的含义:一个数有个位.十位.百位.千位.等等,数的每一位就是数位. 数位DP一般应用于: 求出给定区间[A,B]内,符合条件P[i]的数 i 的个数. ...

随机推荐

  1. 创建虚拟机和安装centos7 & install oracle

    win7 x64位+VMware12+centos7 x64位+oracle 11g R2安装详解(一) 一.虚拟机安装oracle11g R2的安装环境: 1.win7 x64位          ...

  2. 顺时针打印矩阵(剑指offer-19)

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  3. vs遇到的字符串问题

    原以为自己的字符串已经理解不错了, 今天又被vs搞了. 情景就不说了, 直接说结果: 有两种情况 1 当文件是存储为gbk或者utf-8的时候, 中文字符存储永远是gbk的值. ‘按’字的gbk编码 ...

  4. 小程序checkbox-group只获取到一个值

    wx:for循环不能写在checkbox-group标签上 wx:for循环不能写在checkbox-group标签上 wx:for循环不能写在checkbox-group标签上 wx:for循环不能 ...

  5. 属性复制神器-mapstruct

    我们之前说到项目中会用到各种object,vo,bo,dto等等.我们需要在不同的对象上复制属性. 一.BeanUtils和PropertyUtils 我们最常用的就是Common包里面的BeanUt ...

  6. day77 作业

    目录 一.完成todolist案例 二.商品页面 一.完成todolist案例 <!DOCTYPE html> <html lang="en"> <h ...

  7. 机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD(四) PCA与SVD 之 PCA中的SVD

    PCA中的SVD 1 PCA中的SVD哪里来? 细心的小伙伴可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?我们之前曾经提到过,P ...

  8. python 生成器(五):生成器实例(一)创建数据处理管道

    问题 你想以数据管道(类似Unix管道)的方式迭代处理数据. 比如,你有个大量的数据需要处理,但是不能将它们一次性放入内存中. 解决方案 生成器函数是一个实现管道机制的好办法. 为了演示,假定你要处理 ...

  9. C# - 设计- Struct与Class的选择

    选择Struct的原则 该类型的实例较小且通常为短生存期,或者通常嵌入到其他对象中. 它以逻辑方式表示单个值,类似于基元类型( int .等 double ). 它的实例大小为16字节. 它是不可变的 ...

  10. bzoj1339[Baltic2008]Mafia*

    bzoj1339[Baltic2008]Mafia 题意: 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控.对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得 ...