Day-5

DP

背包

多重背包 单调队列

  • ???

P4141

  • 退背包
  • 由暴力到优化
    • 每删一个, 做一次背包
      • $ n ^ 2 m $
    • 前后缀
      • F(i, j) 前 i 件, G(i, j) 第i - n 件
      • $ n m ^ 2 $
    • 退掉 i 物品
      • $ f(i, j) = \sum {f(i - 1, x)}$
      • $ f(j) -= f(j - w_i) $
  • 拓展:去掉 i , 求 max
    • 分治背包
    • 目的:除 i 以外的背包
    • 每次走哪边, 就把相反的一边加入(走左加右), 走到最底层, 就只有一个点没加进去, 达成目的

P2371

  • 背包做法
  • n 比较小, a 相比 l, r 较小
  • 凑出 x, 则 \(x + a_1, x + 2a_1 ....\) 都可以凑出来
    • j 通过 a_k 到 \((j + a_k) \% a_1\), \(dp[(j + a_k) \% a_1] = dp[j] + a_k\), 形似最短路

P8392

  • 重量很小, 数量, 个数都很大
  • 贪心能得到 < l 的最大个数
  • 贪心 + DP
    • 怎么调整 ???
    • 再跑一次多重背包

P4322

  • 暴力 \(dp(i, k, \sum a) = \sum b\)
    • 求 b 的最小值
  • 答案为 ans
    • $ ans \le \sum a / \sum b$
    • $ 0 \le \sum(a - b * ans) $
    • 二分 ans, 树形背包

区间DP

  • 倒着考虑
  • 最后一共一堆
    • 上一步是一个前缀和一个后缀合并
    • 都是区间合并
    • 枚举由哪两个区间合并

BZOJ 4380

  • [l, r] -> 找区间最小值 -> 全局最小值 :跨过全局最小值的花费为它

    • 剩下的分为两种:在他左边的, 右边的 -> 两个区间
    • 只有 f(l, r) 没法转移
      • 再记录一维最小值 k, f(l. r, k)
  • c 离散化

  • 枚举最小值的位置 p 和值 k

    • 枚举左右边的最小值(>= k) 复杂度太高
    • 对左右边最小值做前缀和,O(1) 转移
  • $O(n ^ 3 m) $

  • 脑子里存着做法, 考试的时候试

AGC 26 D

  • h 全相等怎么做
    • 确定一行, 剩下的最多有两种填法
    • 确定最下面, 上面 01 反转 \(2^n(第一行2^n, 第一行确定了上面只有1种填法)\)
    • 01 交替 \(2^h\)
      • 重复的:010101..., 101010 (01反转)
  • 不全相等?
    • 最下面加上一行, 假设上面已知, 要求你填这一行 懒人思维法
    • 上面的
      • 01交替 || 空的:方案数*2
      • 否则不变
    • 上面的和第一行一样
    • dp(l, r, k, 0/1) 区间[l, r], 高为k, 是否01交替
  • $O(n * n * h_i * 2) $
    • 但是有些 \(h_i\) 用不到(h0 = 1, h1 = 10, h2 = 1)
    • 高出去的都可以跳掉(单独算)
  • 怎么分段?
    • \(h_i\) 的最小值分成左右两部分
    • 用笛卡尔树

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 的最大价值 $O(nk) $

  • 假设 c 相同

    • 贪心选价值大的
    • 同体积排个序, 从大到小选 \(O(nk)\)
    • \(f(i, j) = max{f(i - 1, j - v_k) + w_k}\)
    • 作用:改变转移式, 用来优化
  • 单调性

    • 考虑四边形不等式
    • 但是唯一的价值函数 w 是一维的
    • 转化:
      • \(w_k = w_{j - k, j}\)
      • 跟长度有关,交叉优于包含
    • 为什么满足决策单调性?
  • 把一维函数改写成满足四边形不等式的函数

斜率优化

板子

  • 推导

    • \(f(i, j) = min(f(k, j - 1) + (s_i - s_k)^2) + c\)

    • 假设 j < k 且 f(k) 优于 f(j)

    • \(f(j) + (s_i - s_j)^2 \ge f(k) + (s_i - s_k)^2\)

    • \(f(j) + s_j = g(j)\)

    • \(g(j) - 2s_is_j \ge g(k) - 2s_is_k\)

    • \(\frac{g(j) - g(k)}{s_j - s_k} \ge 2s_i\)​ 类似于斜率的公式

    • 另一个

      • \(f(i) = min(f(k) + (s_i - s_k)^2)+c)\)

      • \(f(k) + s_i ^ 2 + s_k ^ 2 - 2s_is_k\)

      • \(f(i) = min(f(k) + s_k^2 - 2s_is_k) + c + s_i^2\)

      • \(f(i) = min(g(k) - 2s_is_k)+...\)

  • 然后??

  • 上/下凸包???

  • 好写的方法:向量判断

P3648

  • DP 顺序

    • 代价和分割顺序无关
  • 暴力 $f(i, k) = max(f(j, k - 1) + (s_i - s_j) * (s_n - s_i)) $

  • \(s_is_n-s_i^2丢掉\) && \(f(j) - s_js_n = g(j)\) && $ -s_is_j$

  • 设 j < k 且 k 优于 j

  • \(\frac{g(k) - g(j)}{s_k - s_j} \ge -si\)

  • 看成点 $ (s_i, g(i)) $

  • \(-s_i\) 单减, 上凸包

  • 判断凸包

    • 找三个点, 构成三角形

    • 斜率由正无穷减小

    • 上凸包

      image-20240219153319897

      image-20240219153447060

CF1175G

  • 暴力:\(f(i, k) = min(f(j, k - 1) + (i - j) * max_{j + 1, i})\)

  • 消掉 max

    • 单调栈
    • 分成一段一段, 段内 max 相同
  • \(f(j) + (i - j) * max\)​ max会变

  • 离线凸包 或 在线李超树

    • 有很多条函数, 维护他们他最大值 $F(i) = max(f(i), g(i)...) $
    • 最小值是上凸包, 最大值是下凸包
    • 合并凸包:启发式
  • 题解

CEOI 2017

  • 在端点相交 1 3 建了桥, 2 4就不能建桥
  • \(f(i) = min(f(j) + (h_i - h_j) ^ 2 + s_{i - 1} - s_j\)
  • \(g(j) = h_j ^ 2 + f(j) - s_j\)
  • j < k 且 k 优于 j
    • \(g(k) - g(j) \le 2h_i(h_k - h_j)\) 但是 \(h_k - h_j\) 正负未知,无法移项
  • 法二:
    • \(f(i) = min(f(j) + (h_i - h_j) ^ 2 + s_{i - 1} - s_j\)
    • min 拆开
    • \(f(i) - s_{i - 1} - h_i^2 = -2h_ih_j + f(j) + h_j^2 - s_j\)
    • \(g(j) = f(j) + h_j^2 - s_j\)
    • \(f(i)\) 尽可能小 -> \(-2h_ih_k\) 变小
    • \(-2h_ih_j\) -> 直线 \(kx\)
    • 最小值是上凸包, 李超树

wqs 二分

  • 解决的问题:恰好分为 k 段, 且该函数为凸函数

  • 解决办法:用直线切凸包, 不断改变斜率

  • 二分斜率

  • 描述 ‘切’

    • 过凸包上每一个点做一条该斜率的直线
    • 切点在 y 轴的截距最大/小(上/下凸包)
    • \(kx + b的b最大/小\)

板子

  • 段数越多, 答案越小
  • 下凸包
  • 最小化 \(f(x) - kx\)
  • 实现???

P4383 往后重看

posted @ 2024-02-21 22:03  Bubble_e  阅读(4)  评论(0编辑  收藏  举报