ZROI 19.08.03 DP入门

Posted suwakow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZROI 19.08.03 DP入门相关的知识,希望对你有一定的参考价值。

  • \(n\)个点,要求连一棵树,设点\(i\)的度数为\(d_i\),则其贡献为\(f(d_i)\mod 59393\),其中\(f(x)\)是一个\(k\)次多项式。最大化总贡献。\(n\leq 3000, k\leq 10, a_i\leq 50\)

对于任意一种度数序列,都可以生成一棵对应的树。

每个点度数\(\geq 1\)\(-1\)后等于\(n\)个点分\(n-2\)个度数。

\(O(n^3)\)dp:\(f_i,j\)表示前\(i\)个点,度数和为\(j\)的最优解,转移的时候枚举新点度数。

实际上不需要限制非\(0\)数的个数,直接枚举度数做完全背包,\(O(n^2)\)

dp时很多状态是非必要的,通过一些转化,去掉它们就可以优化很多。

(顺便一提,模数是ntt模数,然而这题和ntt没什么关系)


\(f_i,j\)表示第\(i\)个单位,血量为\(j\)的概率。

询问的时候对每个单位算出\(g_i,j\),表示除了第\(i\)个单位之外,有\(j\)个单位存活的概率。先把所有单位的背包算出来,每个单位的\(g_i\)相当于退一个背包,用除一个\(ax+b\)的方法,可以做到单次\(O(n^2)\)

复杂度\(O(nm+n^2C)\)


  • 一个\(n\)个点的图,求\(k\)个叶子的生成树个数。\(n\leq 15\)

一种dp:设\(f_\a_1.…,a_n\,a_i=\0,1,2\\),表示每个点没选/选了,是/不是叶子的方案数。

然后这个dp被ytq枪毙了。

考虑容斥,枚举叶子集合,剩下的点Matrix-Tree求出生成树个数,然后把叶子挂在生成树下面。用fmt/fwt优化容斥,复杂度\(O(3^n)\)


  • \(\2…n\\),共\(n-1\)个数。两个人各取一个子集\(S,T\),要求不存在\(x\in S,y\in T\),使得\(\gcd(x,y)\not=1\),求方案数。\(n\leq 500\)

\(x^2\leq 500\)的质数最多\(8\)个。

意味着对于一个数,不属于这些质数的质因子最多一个。

枚举\(8\)个质因数中每个属于\(S,T\),还是都不属于。dp大质数各自属于哪个集合即可。复杂度\(O(3^8\cdot n)\)


  • \(n\times m\)的网格,每个位置有权值。选若干个位置,满足任意两个位置八方向不连通,求最大权值。\(n\leq 12,m \leq 100\)

插头dp经典问题。


  • \(n\)个点的有根森林,两个人轮流选点,删去这个点的祖先和它本身,保留其余点的父子关系(即,可能生成若干棵树)。不能操作者输,求先手是否必胜。\(n\leq 10^5\)

\(f_i\)表示以\(i\)为根的子树的sg函数,对每个点暴力dfs,\(O(n^2)\)暴力很好做。

发现一个儿子转移到父亲,它的子问题的sg函数,需要整体xor上一个值,用trie维护,直接线段树合并就可以了(\(01\)trie的本质就是一个二进制分组的权值线段树)。


  • 平面上有\(2n\)个球,有\(2n\)个机器人,分别位于横、纵轴\([1,n]\)的位置。激活一个机器人会拿走它坐标轴垂直方向最近的球。问多少顺序可以拿走所有球。\(n\leq 10^5\)

\(2n\)个点分别表示第\(i\)行和第\(i\)列。对于\((x,y)\)的球,从\(x\)行向\(y\)列连边,边权为\(x+y\)。每次激活一个点,等于选了与它相连的剩余权值最小的边。

考虑合法的方案,要求每个连通块边数等于点数,且每个点出度为\(1\)。发现是一个基环内向树。

环上枚举顺时针或逆时针,树上可以直接树dp。


  • 数轴上有\(n\)个点,第\(i\)个的位置是\(x_i\)。你的起点是\(0\),终点是\(E\),速度是\(1\)单位每秒。对于每个点,设第一次走上去的时间为\(t_i\),则会在\(t_i+T\)时刻产生一个硬币。求收集所有硬币并走到终点的最小时间。\(n\leq 10^5,0 < x_i < E\)

\(f_i\)表示最后一次在\(x_i\)处回头的最小时间,列出暴力方程:

\[f_i=\max_j<i\f_j+x_i-x_j+\max(2(x_i-x_j),T)\\]

\(\max\)表示路程太短没法生成硬币,需要等一会。

拆成两部分dp,对于\(\max=T\)的一部分,可以单调队列优化。否则就是一个前缀最小值。可以线性完成。好水啊


  • 给一个序列\(a_i\),对每个\(i\)找一个最小的\(p_i\),满足对所有\(j\)\(p_i\geq a_j-a_i+\sqrt|i-j|\)\(n\leq 10^6\)

有个比较显然的\(O(n\sqrt n)\)做法,即枚举平方根,对每个平方根用单调队列优化。

四边形不等式:若\(w_i,j\)满足内内+外外\(\geq\)内外+外内,则称\(w_i,j\)满足四边形不等式,利用\(w_i,j\)转移的方程满足决策单调性。

利用决策单调性优化方程需要快速算出\(w_i,j\),或\(w_i,j\)满足莫队性质。

一般情况下是分治计算,即,暴力算出\(mid\)处的最优位置,然后递归两边。


暴力做法:枚举中位数\(\mu\),每条边拆成\(a_i,2\mu-a_i\)两条边,分别为黑和白。就转化为了\(k\)白边最小生成树,wqs二分即可。复杂度\(O(nm\log a\cdot \alpha(n))\)

结论:最大生成树只包含\(w\geq \mu\)的黑边和\(w<\mu\)的白边。

发现枚举\(\mu\)的操作只对白边有影响,可以和wqs二分放到一起,复杂度\(O(m\log a\cdot \alpha(n))\)


  • 有一个二进制串,初始全是\(0\)。现在有\(m\)次操作,每次操作有\(p_i\)的概率给这个串加上\(2^a_i\),一次操作的代价是这次操作导致二进制串变化的位数,求所有操作的期望代价和。\(a_i,m\leq 2\times 10^5\)

答案等于所有过程进位次数加上最后保留的\(1\)的个数,所以操作顺序对答案没有影响。

\(f_i,j\)表示前\(i\)位,这一位被加了\(j\)次的期望,则\(f_i,j\)可以转移到\(f_i+1,\lfloor\fracj2\rfloor\)

操作等于乘以一个\(p_ix+(1-p_i)\)的多项式,可以分治fft。

假设某个位置操作了\(y\)次,则它最多进位\(\log_2y\)次,相当于每个多项式最多前进\(\log\)步。只需要处理有用的部分即可。复杂度\(O(n\log^2n)\)

以上是关于ZROI 19.08.03 DP入门的主要内容,如果未能解决你的问题,请参考以下文章

ZROI 19.07.29 线性代数入门/wq

DP问题从入门到精通3(区间DP,计数DP)

DP问题从入门到精通3(区间DP,计数DP)

DP问题从入门到精通3(区间DP,计数DP)

DP问题入门到精通5(树形dp,记忆化)

DP问题入门到精通5(树形dp,记忆化)