首页 > 其他分享 >斜率优化dp

斜率优化dp

时间:2024-07-09 18:08:47浏览次数:16  
标签:le 2S 斜率 ge dp 2LS 优化 单调

斜率优化

老早之前就学了,但一知半解地过了几道题就忘了

  • 用途:用于解决\(f_i = min/max_{L(i)\le j\le R(i)}\{f_j+val(i,j)\}\)此类dp问题,其中当\(val\)中的每一项只与\(i\)或只与\(j\)有关时,可以考虑用单调队列优化,而当\(val\)包含\(i\)与\(j\)的乘积时,可以考虑斜率优化。

  • 引入例题说明

玩具装箱

  1. 先考虑暴力dp

    设\(f_i\)表示已经处理好\(i\)个玩具后的最小费用,
    则有

    \[f_i = \min{f_j+((i-j-1+\sum_{k = j+1}^iC_i)-L)^2} \]

    暴力dp,时间复杂度\(O(n^3)\),
    利用前缀和优化,时间复杂度\(O(n^2)\)

    于是我们就喜提70pts

那么怎么AC此题呢

  1. 考虑优化暴力dp

    设\(S_n\)表示\(\sum_{i=1}^n(C_i+1)\),

    则式子为\(f_i = \min f_j+(S_i-S_j-L-1)^2\)

    将L提前加1,得到\(f_i = \min f_j+(S_i-S_j-L)^2\)

    拆开二次项,为方便去掉\(min\),化简得到

    \[f_i =f_j + S_i^2-2LS_i+(L+S_j)^2-2S_iS_j \]

    接下来有两种理解方式

    • 代数法

      1. 将相同的项放在一起

        共有4种可能:

        1. 未知数只包含i的项,这类项在本次选择中的结果是不变的,在本式子中为\(S_i^2-2LS_i\)
        2. 未知数只包含j的项,这类项只会根据决策点不断变化,在本式子中为\(f_j+(L+S_j)^2\)(本题中表现为严格单调递增)
        3. 未知数既包含i又包含j的项,本式子中为\(-2S_iS_j\)
        4. 常数项,无论何时都不变,本式子将常数项与其它项合并

        则最后的式子为

      \[f_i = (S_i^2-2LS_i)+(f_j+(L+S_j)^2)-2S_iS_j \]

      1. 维护凸包

        凸包是什么

        假设有两个决策点\(j,k(0\le k<j<i)\),且决策点\(j\)优于决策点\(k\),则有

        \[(S_i^2-2LS_i)+(f_j+(L+S_j)^2)-2S_iS_j\le (S_i^2-2LS_i)+(f_k+(L+S_k)^2)-2S_iS_k \]

        对其进行移项,用未知数只含有两个决策点\(j,k\)的式子表示未知数只含有\(i\)的式子,

        \[\because j>k,C_i\ge 1 \therefore S_j-S_k>0 \]

        \[\begin{array}{rcl} (f_j+(L+S_j)^2)-2S_iS_j &\le & (f_k+(L+S_k)^2)-2S_iS_k\\ 2S_i(S_k-S_j) &\le & (f_k+(L+S_k)^2)-(f_j+(L+S_j)^2)\\ 2S_i &\ge & \frac{(f_k+(L+S_k)^2)-(f_j+(L+S_j)^2)}{S_k-S_j} \end{array}\]

        设\(Y(i) = f_i+(L+S_i)\quad X(i)=S_i\)

        则有\(2S_i\ge\frac{Y(k)-Y(j)}{X(k)-X(j)}\)

        也可以记作\(2S_i\ge\frac{Y(j)-Y(k)}{X(j)-X(k)}\)

        等式右侧是一个关于\(P(X(k),Y(k)),P(X(j),Y(j))\)斜率式

        也就是,如果存在两个决策点\(j,k(0\le k<j<i)\),满足\(2S_i\ge\frac{Y(j)-Y(k)}{X(j)-X(k)}\),则决策点\(j\)优于决策点\(k\)。

        image

        考虑如图的三个点,设\(AB\)的斜率为\(k1\),\(BC\)斜率为\(k2\)

        显然的,有\(k2<k1\),设\(k=2S_i\)

        根据上述结论,有

        1. 若\(k1\le k\),则B优于A,反之,若\(k<k1\),A优于B
        2. 若\(k2\le k\),则C优于B,反之,若\(k<k2\),B优于C

        对\(k\)进行分类讨论有
        3. 若\(k<k2<k1\),则A优于B优于C
        4. 若\(k2\le k<k1\),则A,C都优于B
        5. 若\(k2<k1\le k\),则C优于B优于A

        综上,无论如何,B永远不可能是最优决策点,将B踢出去,便只有AC

        像这样维护,最终维护出了一个这样的图形
        image

        维护出了一个下凸包

        同理,若将\(\frac{Y(j)-Y(k)}{X(j)-X(k)}\le k\)改为\(\frac{Y(j)-Y(k)}{X(j)-X(k)}\ge k\)(即求max),维护出的就是上凸包。

      2. 寻找最优决策点

        由于此处斜率具有单调性,故可以用二分法找到第一个斜率大于k的线段。

    • 线性规划

      什么是线性规划 线性规划(Linear programming,简称LP),是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,是辅助人们进行科学管理的一种数学方法,是研究线性约束条件下线性目标函数的极值问题的数学理论和方法。(节选自百度百科)

      dp方程:\(f_i =f_j + S_i^2-2LS_i+(L+S_j)^2-2S_iS_j\)

      考虑移项,将其化成\(y=kx+b\)的形式,并使其遵循同时含有\(i,j\)的表达式为\(kx\),含有\(f_i\)的表达式位于\(b\)的位置,未知项只含有\(j\)的在\(y\)的位置,如果未知数x的表达式单调递减,最好让等式两边同乘个−1,使其变为单调递增。

      该式可以化为

      \[f_j+(L+S_j)^2=2S_iS_j+f_i+2LS_i-S_i^2 \]

      其中

      \[\begin{array}{rcl} x&=&S_j\\ k&=&2S_i\\ b&=&f_i+2LS_i-S_i^2\\ y&=&f_j+(L+S_j)^2 \end{array}\]

      为了使\(f_i\)最小,即使\(f_i+2LS_i-S_i^2\)最小,就是使\(b\)最小,就是将\(y=kx+b\)向上平移,知道它与凸包上一点相交,则交点即最优决策点。

    此时已经可以做到用二分法在\(O(n\log n)\)的复杂度中解决该问题

  2. 再优化(利用决策单调性)

    • 证明决策单调性

      利用四边形不等式证明决策单调性

      在本题中\(w(i,j)=(S_i-S_j-L)^2\),即证明\(w(i,j+1)+w(i+1,j)\ge w(i,j)+w(i+1,j+1)\)成立

      原式可以表示为

      \[(S_i-S_{j+1}-L)^2+(S_{i+1}-S_j-L)^2\ge (S_i-S_j-L)^2+(S_{i+1}-S_{j+1}-L)^2 \]

      经历一番神奇暴力的推导后,我们成功得到了

      \[w(i,j)+w(i+1,j+1)-w(i+1,j)-w(i,j+1)=-2(C_{i+1}+1)(C_{j+1}+1) \]

      \[\because C_i,C_j\ge 1 \]

      \[\therefore 2(C_{i+1}+1)(C_{j+1}+1)\le -8 \]

      \[\therefore w(i,j)+w(i+1,j+1)\le w(i+1,j)+w(i,j+1) \]

      所以具有决策单调性,用单调队列维护。

  3. 一些注意事项

    1. 比较斜率时尽量写上等于
    2. 尽量让斜率为一个整数
    3. 出入队列时,队列中应该至少有两个元素
    4. 如果斜率不得不为浮点数时,使用long double
    5. 大部分题都要事先在队列中加入一个0,代表决策点0

\(code:\)

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
const int N = 5e4 + 10;
inline ll pw(ll x){return x*x;}
int n,c[N],L;
ll f[N],sum[N];
inline ll Y(int k){return f[k]+pw(L+sum[k]);}
inline long double slope(int j,int k){return 1.0*(Y(j)-Y(k))/(sum[j]-sum[k]);}
int q[N],l,r;
signed main(){
    #ifndef ONLINE_JUDGE
        infile("in.in");outfile("out.out");
    #else
    #endif
    cin.tie(0)->sync_with_stdio(false);
    cout.tie(0)->sync_with_stdio(false);
    cin>>n>>L;L++;
    for(int i = 1;i <= n; ++i) cin>>c[i];
    for(int i = 1;i <= n; ++i) sum[i] = sum[i - 1] + c[i] + 1;
    f[0] = 0;
    l = r = 1;
    for(int i = 1;i <= n; ++i){
        while(l < r && slope(q[l],q[l+1]) <= 2.0*sum[i]) l++;
        f[i] = f[q[l]] + pw(sum[i])-2*L*sum[i]+pw(L+sum[q[l]])-2*sum[i]*sum[q[l]];
        while(l < r && slope(q[r-1],q[r]) >= slope(q[r],i)) r--;
        q[++r] = i;
    }
    cout<<f[n];
}
  • 对单调性的一些研究

    1. 当决策点\(x(j)\)不单调时

      扔平衡树上或CDQ分治(本人不会

    2. 当斜率\(k\)不单调时

      二分(可以参考任务安排3

    3. 都不单调时

      同1,本人还是不会。

  • 例题:

    \(to\,be\,continued\)

标签:le,2S,斜率,ge,dp,2LS,优化,单调
From: https://www.cnblogs.com/hzoi-Cu/p/18285010

相关文章

  • 探秘odpdx32.dll:核心功能解析与缺失修复指南
    odpdx32.dll是一个动态链接库(DLL)文件,通常与DirectX或OpenGL相关的软件或游戏有关。这个文件可能包含了用于处理图形渲染和多媒体播放的函数和资源,是系统中重要的组件之一。当你的计算机在运行某些应用程序时提示缺少odpdx32.dll文件,这意味着该应用程序依赖于这个文件,但当前系......
  • 做题小结-含做不来的计数DP
    第一个题首先这个题我没做出来我在这里还是要总结下基环树喜欢考什么我以前做过一个交互题题目大意忘了反正考的是基环树最重要的一个性质两个点之间一定存在两个走法,一个是正常走另一个是走环反正就是一定有两条路过来那这个题就是考虑这个性质还有就是正常树的要找......
  • jvm+mysql索引优化+sql优化
    一、jvm---线程栈  每个线程都会从内存栈分配一块区域,这个区域里放了此线程变量(按方法,一个方法对应一块栈帧内存区域)。Math.class字节码文件不是给人看的,idea中找到Math类,右键找到terminal,输入javap,底下-c对代码进行反汇编命令:javap-cMath.class>math.txt此时,Math类根......
  • 使用资源编排 ROS 轻松部署单点网站——以 WordPress 为例
    介绍WordPress是一款免费开源的网站内容管理系统(CMS),它可以帮助用户简单快捷地创建和管理自己的网站,包括博客、新闻网站、电子商务网站、社交网络等等。WordPress有丰富的主题和插件库,使得用户可以轻松地为网站定制外观和功能。WordPress的易用性和可扩展性使其成为世界上最受欢......
  • 牛客周赛 Round50 E-小红的树上移动 (期望dp+逆元)
    E-小红的树上移动题目:题意:在一个树上从根节点移动,每次都会向更深的下一层走,如果此时已经是叶子节点没有下一层就会停留在这里。求出移动次数的期望,移动次数就是从根节点1开始到此节点的深度。思路:画一个草图不难看出其实在同一层中,到达每个点的概率是一样的。并且,对于每一层......
  • Profibus转ModbusTCP网关模块实现Profibus_DP向ModbusTCP转换
    Profibus转ModbusTCP网关模块实现Profibus_DP向ModbusTCP转换Profibus和ModbusTCP是工业控制自动化常用的二种通信协议。Profibus是一种串口通信协议,它提供了迅速靠谱的数据传输和各种拓扑结构,如总线和星型构造。Profibus可以和感应器、执行器、PLC等各类设备进行通信。ModbusTC......
  • 内核参数优化
    linux内核参数优化(网络模块)在Linux下调整内核参数,可以直接编辑配置文件/etc/sysctl.conf,然后执行sysctl-p命令生效文件内容如下:net.ipv4.ip_forward=1net.ipv4.conf.default.rp_filter=1net.ipv4.conf.default.accept_source_route=0kernel.sysrq=0kernel.core_......
  • 磁盘100%优化
    输入regedit,点确定。 在注册表中找到HKEY_LOACAL_MACHINE,并展开它。 接着找到SOFTWARE-Microslft-Dfrg,BootOptinizeFunction,并找到OptimizeComplete,双击它。   在弹出的对话框中将OptimizeComplete的值改为"no" 然后关闭注册表即可,重启后再查看磁盘占用......
  • Pyodps2节点连接linux服务器(paramiko 检查文件是否存在)
    在maxcomputer加入paramiko相关资源包1#!/usr/bin/python2#-*-coding:UTF-8-*-34##@resource_reference{"six.zip"}5##@resource_reference{"PyNaCl-1.4.0.zip"}6##@resource_reference{"paramiko-2.7.2.zip"}7##@resource_r......
  • 十三,mysql的优化,详细篇
    目录一,从设计上优化二,从查询上优化三,从索引上优化四,从存储上优化一,从设计上优化    1,合理的进行数据库设计,通过规范化设计可以避免数据冗余,也可以适当的反规范化设计提高查询性能.    2,选择合适的数据类型,确保使用最合适的数据类型来存......