一些奇妙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. 【WebRtc】获取音视频数据

    首页截图 获取音视频 关键Code 获取摄像头数据 /** * 获取流数据 */ openUserMeida() { var that = this // 判断是否支持获取媒体数据 if (!navi ...

  2. influxdb 保留策略

    转载请注明出处: InfluxDB 中的保留策略用于定义时间序列数据在数据库中的保留期限.保留策略决定了数据在 InfluxDB 中的存储持续时间和精度.以下是 InfluxDB 的保留策略类型以及如 ...

  3. struct 结构体分析

    struct分析 1.无成员的空结构体size为 1byte 2.通过/zp可以调整对齐值,默认是8字节 //设编译对齐设定值为Zp //设成员变量的类型为 member type //设成员变量在结 ...

  4. FPGA按键消抖

    简介 按键 按键是输入设备,一般来说,按键在没有按下的时候是高电平:当按键按下的时候,为低电平. 在DE2-70 User Manual中 Each switch provides a high lo ...

  5. FJOI2022 游记

    2022.3.28 省选延期,延到了4.16 2022.4.11 省选又延期,延到了5.2 FJOI 要回来了!! Day -7 开始停课了 QwQ Day -6 打摆 Day -5 打摆 不行,我不 ...

  6. React中setState的使用与同步异步

    在react中,修改状态如果直接使用this.state,不会引起组件的重新渲染,需要通过 this.setState来对组件的属性进行修改. 1.this.setState的两种定义方式 定义初始状 ...

  7. linux编译安装nginx

    前言 系统:centos7和debian11均验证可行 本文将nginx默认支持的编译参数都加上了,所以需要的依赖比较多,酌情配置. 步骤 假设安装在/usr/local/nginx,创建安装目录 m ...

  8. Python怎么通过url下载网络文件到本地

    以下代码演示Python怎么从网络下载一个文件至本地并保存在当前文件夹download import os import requests from urllib.parse import urlpa ...

  9. 如何使用io_uring构建快速响应的I/O密集型应用?

    本文分享自华为云社区<如何使用io_uring构建快速响应的I/O密集型应用>,作者: Lion Long . 当涉及构建快速响应的I/O密集型应用时,io_uring技术展现出了其卓越的 ...

  10. 商品详情接口设计:使用API调用获取淘宝商品数据的完整方案

    ​ 在如今的电商时代,获取商品的详细信息是实现商业化应用的基础.本文将详细介绍如何通过API调用来获取淘宝商品数据,并提供一个完整的商品详情接口设计方案,包括代码示例.开发人员可以根据此方案快速实现商 ...