DP
背包
多重背包 单调队列
- ???
P4141
- 退背包
- 由暴力到优化
- 每删一个, 做一次背包
- 前后缀
- F(i, j) 前 i 件, G(i, j) 第i - n 件
- 退掉 i 物品
- 每删一个, 做一次背包
- 拓展:去掉 i , 求 max
- 分治背包
- 目的:除 i 以外的背包
- 每次走哪边, 就把相反的一边加入(走左加右), 走到最底层, 就只有一个点没加进去, 达成目的
P2371
- 背包做法
- n 比较小, a 相比 l, r 较小
- 凑出 x, 则
都可以凑出来- j 通过 a_k 到
, , 形似最短路
- j 通过 a_k 到
P8392
- 重量很小, 数量, 个数都很大
- 贪心能得到 < l 的最大个数
- 贪心 + DP
- 怎么调整 ???
- 再跑一次多重背包
P4322
- 暴力
- 求 b 的最小值
- 答案为 ans
- 二分 ans, 树形背包
区间DP
- 倒着考虑
- 最后一共一堆
- 上一步是一个前缀和一个后缀合并
- 都是区间合并
- 枚举由哪两个区间合并
BZOJ 4380
-
[l, r] -> 找区间最小值 -> 全局最小值 :跨过全局最小值的花费为它
- 剩下的分为两种:在他左边的, 右边的 -> 两个区间
- 只有 f(l, r) 没法转移
- 再记录一维最小值 k, f(l. r, k)
-
c 离散化
-
枚举最小值的位置 p 和值 k
- 枚举左右边的最小值(>= k) 复杂度太高
- 对左右边最小值做前缀和,O(1) 转移
-
-
脑子里存着做法, 考试的时候试
AGC 26 D
- h 全相等怎么做
- 确定一行, 剩下的最多有两种填法
- 确定最下面, 上面 01 反转
- 01 交替
- 重复的:010101..., 101010 (01反转)
- 不全相等?
- 最下面加上一行, 假设上面已知, 要求你填这一行 懒人思维法
- 上面的
- 01交替 || 空的:方案数*2
- 否则不变
- 上面的和第一行一样
- dp(l, r, k, 0/1) 区间[l, r], 高为k, 是否01交替
- 但是有些
用不到(h0 = 1, h1 = 10, h2 = 1) - 高出去的都可以跳掉(单独算)
- 但是有些
- 怎么分段?
- 由
的最小值分成左右两部分 - 用笛卡尔树
- 由
CF1372E
- 假设上面的都填好了, 你要填最后一行
- 往 1 多的列填
- 枚举一列, 让所有的 1 在这一列
- 分成左半部分, 右半部分的子问题
- f(l, r) 表示区间[l, r] 的最优, 并且只考虑了(l <=u <= v <= l 的区间),u, v是题目中的区间两端点
P6563
- 懒人:x 在 [l, r] 中, 还要多少代价
- f(l, r) = min(max(f(l, k), f(k + 1, r) + ak))
- 优化?
- a 单调不降
- 随着 k 的枚举, ak 越来越大, 代价可能越来越大(f单调性未知)
- 拆开 max
- k 增大, f(l, k) 增大, f(k + 1, r) 减小
- f(l, r) 有一个前缀取f(k + 1, r), 一个后缀取 f(l, k), 有一个分界点(二分得到)
- 后缀:f(l, k), ak都单增, 取结尾最大
- 前缀:f(l, r) = min(f(k + 1, r) + ak) 同一个 r
- 线段树
- 7000 的点不能带 log
- 泛化:单点修改, 区间 min, 只能 log
- 什么时候区间min不带log -> 单调队列
- ???
四边形不等式
- f(i, j) = min(f(i, k - 1) + f(k, j) + w(i, j))
- 如果w满足
- 区间更小更优
- 交叉优于包含
- (见课件)
- 性质:
- (i, j) 的最优决策点是 k, 则(i, j + 1) 的 >= k
- 如何w判断是否满足单调性 (PPT)
- 在区间里暴力枚举决策点(PPT)
石子合并
- 最小代价
- 小区间代价小于大区间
- 交叉优于包含(??)
决策单调性
- 一维:二分队列 ???
- 二维:暴力枚举
???
// 下午
Loj 6039
-
暴力 f(i, j) 前 i 个, 体积为 j 的最大价值
-
假设 c 相同
- 贪心选价值大的
- 同体积排个序, 从大到小选
- 作用:改变转移式, 用来优化
-
单调性
- 考虑四边形不等式
- 但是唯一的价值函数 w 是一维的
- 转化:
- 跟长度有关,交叉优于包含
- 为什么满足决策单调性?
-
把一维函数改写成满足四边形不等式的函数
斜率优化
板子
-
推导
-
-
假设 j < k 且 f(k) 优于 f(j)
-
-
设
-
-
类似于斜率的公式 -
另一个
-
-
-
然后??
-
上/下凸包???
-
好写的方法:向量判断
P3648
-
DP 顺序
- 代价和分割顺序无关
-
暴力
-
&& && -
设 j < k 且 k 优于 j
-
-
看成点
-
单减, 上凸包 -
判断凸包
-
找三个点, 构成三角形
-
斜率由正无穷减小
-
上凸包
-
CF1175G
-
暴力:
-
消掉 max
- 单调栈
- 分成一段一段, 段内 max 相同
-
max会变 -
离线凸包 或 在线李超树
- 有很多条函数, 维护他们他最大值
- 最小值是上凸包, 最大值是下凸包
- 合并凸包:启发式
- 有很多条函数, 维护他们他最大值
-
题解
CEOI 2017
- 在端点相交 1 3 建了桥, 2 4就不能建桥
- j < k 且 k 优于 j
但是 正负未知,无法移项
- 法二:
- min 拆开
尽可能小 -> 变小 -> 直线- 最小值是上凸包, 李超树
wqs 二分
-
解决的问题:恰好分为 k 段, 且该函数为凸函数
-
解决办法:用直线切凸包, 不断改变斜率
-
二分斜率
-
描述 ‘切’
- 过凸包上每一个点做一条该斜率的直线
- 切点在 y 轴的截距最大/小(上/下凸包)
板子
- 段数越多, 答案越小
- 下凸包
- 最小化
- 实现???
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话