一些奇妙trick

观察决策集合

此类问题与单调队列优化dp有部分相似,都是利用决策集合的特殊性质对dp进行优化。

CF229D Towers

题意:给出一个序列,每次可以花费一体力合并相邻两个数,问使此序列形成一个非递减序列最少需要花费多少体力。

由于有明显的操作,考虑从转移角度设计方程,从左往右合并,由于合并只发生在相邻的数对中,而目标为一个非递减序列,主要影响是否合并的就是前一个数的权值,记 \(f_{i,j}\) 表示使前 \(i\) 个数非递减,最后一个数由 \(j\) 到 \(i\) 合并来的最小体力,可以得到一个 \(\Theta(n^3)\) 的方程为 $ f_{i,j}=\min\limits_{1\le k \le j}f_{j,k}+(i-j) $,满足 \(sum_i-sum_{j-1}\ge sum_{j-1}-sum_{k-1}\)。

观察需要满足的条件,可以发现对于一个固定的 \(j\),随着 \(i\) 的增长,能转移的 \(k\) 的集合也只增不减,因此我们可以对于没有 \(j\) 维护一个指针,表示已经求得的 \(k\) 的集合的最右端,每次判断指针是否能够移动并更新最小值,我们定义每次判断分为失败判断和成功判断,由于失败判断每次判断只会产生一次,成功判断对于每个状态也只会产生一次,因此复杂度为均摊 \(\Theta(n^2)\),可以通过此题。

对于进一步的优化,可以查看单调队列优化中的 [CSP-S2019] 划分一题,思路大体相同。

DS优化dp

单调队列优化dp

算法介绍

单调队列优化dp通常与状态转移方程中的单调性息息相关,这里的单调性通常指的是决策的单调性,如果把状态看做空间中的点,在决策集合不断扩大的同时,最优决策点随某一维度不断增长的同时增长就是决策单调性,通俗地说,在满足决策单调性的方程中,现在的最优方案来源一定在前面来源的“后面”。

而单调队列优化dp则是当转移范围受到两个变量限制,并且决策集合只定向移动时,用单调队列维护决策集合的变化。因此,在dp中,如果某一状态的答案选取范围有一些特殊性质时,你就可以尝试分析是否有单调性等特殊性质,成为解题的关键。

决策集合大小固定

此类为最常见的单调队列类题目,通常对于每个状态都有固定的转移范围,注意观察题目中固定的信息,用单调队列进行维护。

P2569 [SCOI2010]股票交易

决策集合不断变化

在决策集合不断变化的题目中也可以使用单调队列,只要保持定向移动的特性即可。

P5665 [CSP-S2019] 划分

DP优化方法杂记的更多相关文章

  1. DP 优化方法大杂烩 & 做题记录 I.

    标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...

  2. DP 优化方法合集

    0. 前言 写完这篇文章后发现自己对于 DP 的优化一窍不通,所以补了补 DP 的一些优化,写篇 blog 总结一下. 1. 单调队列/单调栈优化 1.2 算法介绍 这应该算是最基础的 DP 优化方法 ...

  3. [总结]一些 DP 优化方法

    目录 注意本文未完结 写在前面 矩阵快速幂优化 前缀和优化 two-pointer 优化 决策单调性对一类 1D/1D DP 的优化 \(w(i,j)\) 只含 \(i\) 和 \(j\) 的项--单 ...

  4. [DP优化方法之虚树]

    首先我们看一篇文章 转自xyz: 给出一棵树. 每次询问选择一些点,求一些东西.这些东西的特点是,许多未选择的点可以通过某种方式剔除而不影响最终结果. 于是就有了建虚树这个技巧..... 我们可以用l ...

  5. [DP优化方法之斜率DP]

    什么是斜率dp呢 大概就把一些单调的分组问题 从O(N^2)降到O(N) 具体的话我就不多说了 看论文: http://www.cnblogs.com/ka200812/archive/2012/08 ...

  6. dp常见优化方法

    noip范围内的dp优化方法: 加速状态转移 1.前缀和优化 2.单调队列优化 3.线段树或树状数组优化 精简状态 3:精简状态往往是通过对题目本身性质的分析,去省掉一些冗余的状态.相对以上三条套路性 ...

  7. DP 优化小技巧

    收录一些比较冷门的 DP 优化方法. 1. 树上依赖性背包 树上依赖性背包形如在树上选出若干个物品做背包问题,满足这些物品连通.由于 01 背包,多重背包和完全背包均可以在 \(\mathcal{O} ...

  8. LCA 各种神奇的LCA优化方法

    LCA(Least Common Ancestors) 树上问题的一种. 朴素lca很简单啦,我就不多说了,时间复杂度n^2 1.倍增LCA 时间复杂度 nlongn+klogn 其实是一种基于朴素l ...

  9. Space Elevator [POJ2392] [DP][优化]

    题目大意 n件物品,第i件hi高,有ci件,最高的一件不能超过ai的高度.问最高能堆多高 输入: 第一行,一个n 接下来每一行,为hi,ai,ci 输出,最高堆多高 样例输入: 37 40 35 23 ...

  10. 取数字(dp优化)

    取数字(dp优化) 给定n个整数\(a_i\),你需要从中选取若干个数,使得它们的和是m的倍数.问有多少种方案.有多个询问,每次询问一个的m对应的答案. \(1\le n\le 200000,1\le ...

随机推荐

  1. Web网页音视频通话之基于sipjs功能扩展

    在上一篇开发基础上,已经实现了音视频通话.本文是在此基础上继续完成以下内容 关闭/开启音频 开启/关闭视频 屏幕共享 开启/关闭音频 javaScript /** * 静音 */ mute() { i ...

  2. 浅析本地缓存技术-Guava Cache

    1 引言 作为java开发工作者,相信大家对于guava这个工具包都不会太陌生,而对于本地缓存技术guava cache,大家在日常的工作开发中也都有所了解,接下来本文就从各个角度入手来对于Googl ...

  3. Linux 日志服务管理

    日志管理 1 系统日志管理 1 rsyslog系统日志服务 日志记录的内容包括: 历史事件:时间,地点,人物,事件 Jul 18 14:30:53 # 时间 ubuntu2204 # 地点 (在哪个主 ...

  4. Linux 设置 VI 快捷键 -- 在多个打开的文件中切换

    场景 部署完一系列服务后,想要查看所有服务的 catelina.out 日志: vi $(find /data/http | grep catalina.out | grep -v bak) 这个命令 ...

  5. 最全linux基础知识

    linux基础知识 [root@localhost ~]# 各位置表示什么意识 root:表示用户名 (现在的用户是root切换为test便是张三) localhost:表示主机名 (当前主机名切换为 ...

  6. ACl与ACL实验

    ACl与ACL实验 ACL 1,ACL概述及 产生的背景 ACL: access list 访问控制列表 2,ACL应用 ACL两种应用: 应用在接口的ACL-----过滤数据包(原目ip地址,原目 ...

  7. 【Azure App Service】为部署在App Service上的PHP应用开启JIT编译器

    问题描述 在App Service for linux上创建一个PHP应用,通过 phpinfo() 查看PHP的扩展设置,发现JIT没有被开启, jit_buffer_size 大小为0. 那么,在 ...

  8. 7、Spring之基于注解管理bean

    本质上:所有一切的操作都是Java代码来完成的,XML和注解只是告诉框架中的Java代码如何执行. 7.1.环境搭建 创建名为spring_ioc_annotation的新module,过程参考3.1 ...

  9. Deep Transfer Learning综述阅读笔记

    这是一篇linkedin发表的深度迁移学习综述, 里面讲了一些对于search/recommend system中的迁移学习应用. 有不少指导性的方法, 看完后摘录出来 对于ranking方向的TL, ...

  10. 《Python魔法大冒险》005 魔法挑战:自我介绍机器人

    魔法师和小鱼坐在图书馆的一扇窗户旁,窗外的星空闪烁着神秘的光芒.魔法师轻轻地拍了拍小鱼的肩膀. 魔法师: 小鱼,你已经学会了编写简单的魔法程序,现在我要教你如何创造一个有自己思想的机器人,让它能够和我 ...