zoukankan      html  css  js  c++  java
  • 动态规划

    dp凸优化:

    (1.)对于一个很难求的函数(f(x)),我们发现他是凸函数(导函数单调/差分值单调),且(g(x,k)=f(x)-kx)的极值好算,且能知道取极值的时候(x)的值,那么我们可以凸优化((wqs)二分)。
    (2.)用一条直线去切这个凸包,可以方便的求出切点:
    (对于直线)y=kx+b(,切点就是在)(x,f(x))(中选取使)b(最大的点,由,)max(b)=max(y-kx)=max(f(x)-kx)(可得,切点横坐标是所有点都向下平移)kx$后的最高点。
    (3.)求得切点后,根据切点与所求点位置的关系更新斜率,重复这个过程。

    动态dp:

    大致思想:将dp的转移转化成矩阵的乘法,从而可以快速的进行动态的修改。
    流程:
    把矩阵乘法转变成

    [C_{i,j}=MAX_k{A_{i,k}+B_{k,j}} ]

    然后把dp方程变形成重链上序列的形式。
    对于每一次修改,在重链上更新dp值。

    状压dp:

    如何记状态P4363 【九省联考2018】一双木棋chess.用一个二进制数表示轮廓线,长(n+m)位,含有(n)个1和(m)个00,轮廓线从右上走到左下,二进制中一位(1)表示向下(1)格,(0)表示向左(1)

    插头dp:

    普通版:二进制(0/1)维护是否有插头,讨论合并。
    进阶1.0:题目的限制使得不能任意合并插头,要保留插头在上部的部分信息,那么就要(用最小表示法等+(hash)表)记录,但是效率会变低。
    进阶2.0:根据题目性质用(括号匹配等)更加优化的方法来记录信息。
    进阶3.0:在空间(也可以加hash优化)&打代码时间允许的情况下,用(2)的次幂作为进制,利用二进制操作加快速度。
    广义的括号匹配:把中间的插头设为()(),独立的插头设为(()),这样可以区分该不该合并,但是要注意合并的时候修改插头很麻烦。
    Problems:P2109 [NOI2007]生成树计数

    基环树 & 仙人掌dp:

    建立圆方树,在圆方树上(dp),如果两点之间只有一条边,不建方点。考虑转移:
    1.圆点更新圆点:树上dp
    2.圆点不更新方点。
    3.方点不与方点相连。
    4.方点更新圆点:把所有这个环中的点拿出来跑环上dp。
    要死了:仙人掌剖分?静态仙人掌
    仙人掌分治?跳蚤国王下江南600行?

    组合容斥+dp:

    树形dp:

    所求问题是链,在转移的同时维护,一条链替换另一条的时候,两条链组合更新答案。
    值域

    其他套路:

    用函数表示状态:斜率是整数,函数为下(上)凸壳,维护所有拐点(表示斜率增加/减少1)的位置,转移就是合并两个拐点集合。例题

    dp优化:

    (1.)推式子使得(f)数组周围形式相同把常数和(f)数组合并成新的(dp)数组。
    (2.)

    [f[l,r]=max(a[l,r],max_{i=l}^r{min(f[l,i],f[i,r])}) ]

    枚举答案(T),如果(a[l,r]>T)(l)(r)连边,最后
    看能否联通(1,n)

  • 相关阅读:
    素数推断算法(高效率)
    Hibernate的fetch
    TRIZ系列-创新原理-22-变害为利原理
    Offer是否具有法律效力?
    浅谈C++多态性
    C语言scanf函数详解
    大话设计模式之原型模式
    Android源码文件夹结构
    简单的REST的框架实现
    android startActivityForResult的用法
  • 原文地址:https://www.cnblogs.com/Smeow/p/10582589.html
Copyright © 2011-2022 走看看