首页 > 其他分享 >动态规划——决策单调性优化DP 学习笔记

动态规划——决策单调性优化DP 学习笔记

时间:2023-10-19 22:37:54浏览次数:44  
标签:opt int 笔记 DP 最优 转移 单调 mathrm

动态规划——决策单调性优化DP 学习笔记

决策单调性

对于最优性问题,常有状态转移方程:\(f_i = \min/\max\{f_j\dots\}\),

形象的:如果 \(i\) 的最优转移点是 \(j\),\(i'\) 的最优转移点是 \(j'\),当 \(i<i'\) 时,有 \(j\le j'\),则称该 DP 问题具有决策单调性。

即:\(i\) 单增,其最优转移点单调不减。

如何发现一个转移方程具有决策单调性?打表。

使用

一、离线决策单调性

形如:\(f(i, j) = \min\limits_{k \le j}\{f(i-1, k)+\text{cost}(k,j)\}\),转移分层.

形象的:\(f(i, j)\) 表示将前 \(j\) 个物品分为 \(i\) 端的最小花费,则原式意为,枚举一个 \(k\) 个,将前 \(k\) 个分为 \(i-1\) 段,再加上后面这一段所需的花费。

那么此时,最 native 的算法是,三层循环枚举,时间复杂度就是 \(O(nm^2)\) 的。

决策单调性:设 \(k\) 为 \(f(i,j)\) 的最优转移点,\(k'\) 为 \(f(i, j')\) 的最优转移点,当 \(j<j'\) 时有 \(k\le k'\),则该 DP 具有决策单调性。

形象的:对于每一层(固定 \(i\) 不变),\(j\) 单增,其最优转移点(在 \(i-1\) 层上)单调不减。

因此,我们可以一层一层的 DP,对于第 \(i\) 层,我们先算 \(f(i, \mathrm{mid})\),其中 \(\mathrm{mid} = m/2\);同时求出 \(f(i, \mathrm{mid})\) 的最优转移点 \(f(i-1, \mathrm{opt})\)。那么 \([1,i-1]\) 的最优转移点只能在 \(f(i-1,1\dots \mathrm{opt})\) 中取,\([i+1,n]\) 的最优转移点只能在 \(f(i-1,\mathrm{opt}\dots n)\) 中取。

如图:image

递归下去,即:

\(s(i,l,r,p,q)\) 表示算 \(f(i,l\dots r)\) 且最优转移点只可能在 \(f(i-1,p\dots q)\)中,先算 \(f(i,\mathrm{mid})\) 的值(即枚举 \(p\) 到 \(q\)),求出最优转移点 \(\mathrm{opt}\)。

然后递归求解:\(s(i,l,r,p,q)\rightarrow\left\{\begin{array}{c}s(i,l,\mathrm{mid}-1,p,\mathrm{opt})\\s(i,\mathrm{mid}+1,r,\mathrm{opt},q)\end{array}\right.\).

则时间复杂度为 \(O(nm \log m)\)。

例题CF321E Ciel and Gondolas.

点击查看代码

仅核心代码。

暴力:

inline int cost(const int x, const int y) {
    return (s[y][y] - s[y][x - 1] - s[x - 1][y] + s[x - 1][x - 1]) >> 1;
} signed main() {
    int n = ur, k = ur;
    for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) s[i][j] = ur + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
    memset(f, 0x3f, sizeof f); for (int i = 0; i <= n; ++i) f[i][0] = 0;
    for (int i = 1; i <= k; ++i) for (int j = 0; j <= n; ++j) {
        for (int t = 0; t <= j; ++t) f[i][j] = min(f[i][j], f[i - 1][t] + cost(t + 1, j));
    } printf("%d\n", f[k][n]);
    return 0;
}

决策单调性优化:

inline int cost(const int x, const int y) {
    return (s[y][y] - s[y][x - 1] - s[x - 1][y] + s[x - 1][x - 1]) >> 1;
} void solve(int i, int l, int r, int p, int q) {
    if (l > r) return;
    int j = l + r >> 1, opt = 0;
    for (int t = p; t <= q && t <= j; ++t) {
        int e = f[i - 1][t] + cost(t + 1, j);
        if (f[i][j] > e) f[i][j] = e, opt = t;
    }
    solve(i, l, j - 1, p, opt);
    solve(i, j + 1, r, opt, q);
} signed main() {
    int n = rr, k = rr;
    for (int i = 1; i <= n; ++i) for (int j = 1 ; j <= n; ++j) s[i][j] = rr + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
    memset(f, 0x3f, sizeof f); f[0][0] = 0;
    for (int i = 1; i <= k; ++i) solve(i, 0, n, 0, n);
    printf("%d\n", f[k][n]);
    return 0;
}

二、离线决策单调性

一维 DP,形如:\(f_r=\min\limits_{l=1}^{r-1}\{f_l+\text{cost}(l,r)\}\).

其决策单调性为 \(i\) 单增,其最优转移点 \(j\) 单调不见,比如:11122222244 这种。

image

没听懂 zhq 老师讲的,等着看 wzm 的回放。。。

三、区间 DP 决策单调性

对于最优化的区间 DP,设 \(d_{i,j}\) 为 \(f_{i,j}\) 的最优转移点,具有决策单调性的条件为 \(d_{l,r-1} \le d_{l,r} \le d_{l+1,r}\)。

求解方法:按长度枚举区间;计算 \(f_{lr}\) 的时候,从 \(d_{l,r-1}\) 枚举到 \(d_{l+1,r}\)。

时间复杂度:\(O(n^2)\),神奇的证明(\(\text{By zhq}\))如图:

image

题单

见:https://www.luogu.com.cn/training/386809

Reference

[1] https://oi-wiki.org/dp/opt/quadrangle/
[2] https://www.cnblogs.com/lnzwz/p/12444390.html
[3] https://www.cnblogs.com/lhm-/p/12229791.html
[4] https://www.luogu.com.cn/blog/command-block/dp-di-jue-ce-dan-diao-xing-you-hua-zong-jie

标签:opt,int,笔记,DP,最优,转移,单调,mathrm
From: https://www.cnblogs.com/RainPPR/p/decision-monotonicity-dp.html

相关文章

  • 基本语法——lower/upper_bound 学习笔记
    基本语法——lower/upper_bound学习笔记正文本文保证:你看了也不懂\(\texttt{lower\_bound}\)\(\texttt{upper\_bound}\)默认比较函数返回第一个\(\cancel{<}\text{value}\)的元素返回第一个\(>\text{value}\)的元素自定义比较函数返回第一个\(\texttt{f......
  • 205-303 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.17-3.3
    一、水平自动扩容和缩容HPA(K8S版本>=1.23.x)HPA全称HorizontalPodAutoscaler,Pod水平自动伸缩,HPA可以基于CPU利用率replicationcontroller、deployment和replicaset中的pod数量进行自动扩缩容。pod自动缩放对象适用于无法缩放的对象,比如DaemonSetHPA由KubernetesAPI资源和控......
  • WordPress网站更换域名后如何重新激活elementor
    WordPress网站更换域名后,在WordPress后台,elementor的license状态会显示为mismatch状态,需要重新激活license,下面将讲解如何重新激活elementor。1、WordPress后台断开原elementor连接在WordPress后台,elementor下点击Disconnect断开原elementor连接。断开原elementor连接2、Elementor......
  • 学习笔记6 截图+代码
    一、苏格拉底挑战二、遇见的问题三、实践和代码#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(){char*programPath="/path/to/your/program";//指定要执行的程序的路径char*constargv[]={programPath,NULL};......
  • TCP和UDP
                ......
  • python学习笔记-异步非阻塞web框架
    一、异步非阻塞框架介绍1、介绍支持异步非阻塞web框架:tornado,nodejs2、定义对比异步IO模块:我们作为客户端向服务端“并发”请求异步非阻塞web框架:针对服务端,希望一个线程处理更多的请求二、tornado异步非阻塞【要点提炼】使用装饰器@gen.coroutine模拟等待,使用特殊的......
  • openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管
    openGauss学习笔记-104openGauss数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换openGauss默认配置了通过openssl生成的安全证书、私钥。并且提供证书替换的接口,方便用户进行证书的替换。104.1操作场景openGauss默认配置了SSL连接所需要的安全的证书、私钥,用户......
  • 【刷题笔记】89. Gray Code
    题目Thegraycodeisabinarynumeralsystemwheretwosuccessivevaluesdifferinonlyonebit.Givenanon-negativeinteger n representingthetotalnumberofbitsinthecode,printthesequenceofgraycode.Agraycodesequencemustbeginwith0.Exam......
  • [USACO19DEC] Greedy Pie Eaters P 区间dp
    题目背景FarmerJohnhasMMcows,convenientlylabeled1…M1…M,whoenjoytheoccasionalchangeofpacefromeatinggrass.Asatreatforthecows,FarmerJohnhasbakedNNpies(1≤N≤3001≤N≤300),labeled1…N1…N.Cowiienjoyspieswithlabelsinther......
  • HAVING 使用 和 两个之间更新(笔记)
    SELECTAPPROVAL_ID,count(STATION_SNAP_ID)fromT_INVEST_STATION_APLwhereAPPROVAL_IDin(selectDISTINCTPROJECT_IDfromT_ARCHIVE_DETAILwhereDATA_TYPEin('1','2','3'))andIS_DEL='0'GROUPBYAPPROVAL_IDHAVIN......