一些奇妙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. 前端Vue自定义开屏启动广告组件,点击广告图跳转广告详情

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身. 通过组件化开发,可以有 ...

  2. windows下安装及配置JDK(详解版)

    1.下载JDK 本文以JDK1.8为主 JDK1.8官方下载链接 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloa ...

  3. 使用Docker安装Apollo并使用SpringBoot连接配置中心

    上篇文章我们学习了Apollo的本地安装,如果还不会本地安装的朋友可以查看之前的文章进行了解和学习链接地址(https://www.cnblogs.com/eternality/p/17583023. ...

  4. 2021-11-30 wpf的mvvm绑定2

    主页页面代码 <Grid> <TextBox x:Name="First" Width="80" Height="20" ...

  5. Windows 环境下载、安装、使用(.Net 5.0) Redis 数据库及常见问题的解决

    〇.前言 Redis (Remote Dictionary Server 远程字典服务)是一个使用 ANSI C 编写的开源.包含多种数据结构,支持网络.基于内存.可选持久性的键值对存储数据库,是现在 ...

  6. Dokcer学习之旅(2)——Dockerfile基础应用

    什么是Dockerfile? 从docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本, ...

  7. OpenSSH版本升级漏洞修复问题

    Hi, I'm @Merbelue 大家好,这篇为大家介绍二进制方式对OpenSSH版本升级,在生产环境中可用于解决版本升级.漏洞修复等. @ 目录 1.环境 2.安装telnet 2.1.检查是否安 ...

  8. Redis从入门到放弃(11):雪崩、击穿、穿透

    1.前言 Redis作为一款高性能的缓存数据库,为许多应用提供了快速的数据访问和存储能力.然而,在使用Redis时,我们不可避免地会面对一些常见的问题,如缓存雪崩.缓存穿透和缓存击穿.本文将深入探讨这 ...

  9. 一台服务器上部署 Redis 伪集群

    哈喽大家好,我是咸鱼 今天这篇文章介绍如何在一台服务器(以 CentOS 7.9 为例)上通过 redis-trib.rb 工具搭建 Redis cluster (三主三从) redis-trib.r ...

  10. 《SQL与数据库基础》23. 读写分离

    目录 读写分离 一主一从 准备 配置 双主双从 准备 配置 主库配置 从库配置 从库关联主库 主库相互复制 双主双从读写分离 本文以 MySQL 为例.以 MyCat 数据库中间件为例,通过 MyCa ...