首页 > 其他分享 >OI 简要笔记(持续更新)

OI 简要笔记(持续更新)

时间:2022-11-16 10:12:30浏览次数:52  
标签:sz 简要 OI int 复杂度 笔记 背包 mathcal dp

E - 动态规划

背包 dp

退背包:在背包问题中,禁用某个物品后修改 dp 数组的操作。

退背包只适用于技术类问题,在最优化问题中不适用。

0/1 背包退背包:

// 加入背包
for (int i = m; i >= w; i --) f[i] += f[i - w];

// 退出背包
for (int i = w; i <= m; i ++) f[i] -= f[i - w];

完全背包退背包:

// 加入背包
for (int i = w; i <= m; i ++) f[i] += f[i - w];

// 退出背包
for (int i = m; i >= w; i --) f[i] -= f[i - w];

树形 dp

容量有关节点数的树上背包,时间复杂度:\(\mathcal{O}(n^2)\)。

void dp(int u) {
	sze[u] = 1;
	for (v : son[u]) {
        for (int i = 0; i <= sze[u] + sze[v]; i ++) g[i] = 0;
		for (int i = 0; i <= sze[u]; i ++)
			for (int j = 0; j <= sze[v]; j ++)
				// f[u][i] merge f[v][j] -> g[i + j]    (O(1))
        for (int i = 0; i <= sze[u] + sze[v]; i ++) f[u][i] = g[i];
		sze[u] += sze[v];
	}
}

证明:点 \(u\) 对复杂度的贡献是所有满足 \(\text{LCA}(x, y) = u\) 的无序点对 \((x, y)\) 的对数,故总时间复杂度为任意点对 \((x, y)\) 的对数,这样的点对有 \(\mathcal{O}(n^2)\) 个。

Q.E.D


容量有关节点数且不超过 \(k\) 的树上背包,时间复杂度:\(\mathcal{O}(nk)\)。

void dp(int u) {
	sze[u] = 1;
	for (v : son[u]) {
        for (int i = 0; i <= std::min(sze[u] + sze[v], k); i ++) g[i] = 0;
		for (int i = 0; i <= std::min(sze[u], k); i ++)
			for (int j = 0; j <= std::min(sze[v], k - i); j ++)
				// f[u][i] merge f[v][j] -> g[i + j]    (O(1))
        for (int i = 0; i <= std::min(sze[u] + sze[v], k); i ++) f[u][i] = g[i];
		sze[u] += sze[v];
	}
}

证明:对当前的两棵子树 \(u, v\) 的 \(sz_u, sz_v\)(不妨设 \(sz_u < sz_v\))进行分类讨论。

  • 若 \(sz_u > k\) 且 \(sz_v > k\):每次合并的复杂度为 \(\mathcal{O}(k^2)\),这样的合并不超过 \(\frac{n}{k}\) 次,故该部分复杂度为 \(\mathcal{O}(nk)\)。
  • 若 \(sz_u \leq k\) 且 \(sz_v > k\):每次合并的复杂度为 \(\mathcal{O}(sz_u \cdot k)\),相当于小子树中的每个点都花费 \(\mathcal{O}(k)\) 的复杂度加入大子树,由于小子树中的每个点只会发生一次这样的变化,故该部分复杂度为 \(\mathcal{O}(nk)\)。
  • 若 \(sz_u \leq k\) 且 \(sz_v \leq k\):每次合并的复杂度为 \(\mathcal{O}(sz_u \cdot sz_v)\),相当于 \(u\) 的子树中的每个点都花费 \(\mathcal{O}(sz_v)\) 的复杂度使得子树大小扩大 \(sz_v\),由于小子树中的每个点扩大的值至多为 \(k\),故该部分复杂度为 \(\mathcal{O}(nk)\)。

综上所述,总时间复杂度为 \(\mathcal{O}(nk)\)。

Q.E.D

数位 dp

斜率优化 dp

决策单调性优化 dp

子集 dp

\(\mathcal{O}(4^n)\)枚举:

for (int S = 1; S < (1 << m); S ++)
    for (int T = 1; T < (1 << m); T ++)
        if (T & S == T) // f[T] -> f[S]

\(\mathcal{O}(3^n)\) 枚举:

for (int S = 0; S < (1 << m); S ++)
    for (int T = S; T; T = (T - 1) & S)
        // f[T] -> f[S]

\(\mathcal{O}(2^n n)\) 子集 dp:将一个二进制状态看成一个 \(n\) 维的坐标,相当于是要求满足每个维度的值都小于该坐标对应维度的值的所有坐标的权值和,高维前缀和。

for (int i = 0; i < m; i ++)
    for (int S = 1; S < (1 << m); S ++)
        if (S >> i & 1) // f[S ^ (1 << i)] -> f[S]

DAG 计数

有标号 DAG 计数:考虑一个不一定弱联通的 DAG,将 DAG 视作一个分层图,枚举拓扑序第一层(零入度点)。

  • \(\mathcal{O}(n^3)\):设 \(f(i, j)\) 表示大小为 \(i\) 的 DAG,共 \(j\) 个零入度点时的方案数,枚举 \(k\) 为拓扑序第二层(删去拓扑序第一层后的零入度点)节点数,则

\[f(i, j) = \sum\limits_{k = 1}^{i - j} (2^j - 1)^{k}(2^{i - j - k})^j f(i - j, k) \]

  • \(\mathcal{O}(n^2)\):设 \(f(i)\) 表示大小为 \(i\) 的 DAG 的方案数,钦定该 DAG 有 \(j\) 个零入度点,则

\[f(i) = \sum\limits_{j = 1}^i (-1)^{j + 1} \binom{i}{j} 2^{j(i - j)} f(i - j) \]


有标号弱联通 DAG 计数:

连通性计数

连通性计数套路:枚举与 \(1\) 相连的连通块大小。


例:包含 \(n\) 个点的简单有标号无向连通图个数。

设 \(f_i\) 表示包含 \(i\) 个点的简单有标号无向连通图数,\(g_i = 2^{i(i - 1)/2}\) 表示包含 \(i\) 个点的有标号无向连通图数,则有

\[f_i = g_i - \sum\limits_{j = 1}^{i - 1} \binom{i}{j} f_{j}g_{i - j} \]

分治 FFT 形式:

\[\frac{f_i}{i!} = \frac{g_i}{i!} - \sum\limits_{j = 1}^{i - 1} \frac{f_{j}}{j!} \frac{g_{i - j}}{(i - j)!} \]


例:包含 \(n\) 个点的连通图,初始无边,每次在 \([1, n]\) 中独立地等概率随机两个点 \((u, v)\)(可以相同),然后在 \(u, v\) 间连一条边,求使得图连通的期望操作次数。

设 \(f_{i, k}\) 表示包含 \(n\) 个点的图,经过 \(k\) 次操作仍不连通的概率,则有

\[f_{i, k} = \sum\limits_{j = 1}^{i - 1}\sum\limits_{k' = 0}^{k} \binom{i - 1}{j - 1} \binom{k}{k'} (1 - f_{j, k'}) \left(\frac{j^2}{i^2}\right)^{k'}\left(\frac{(i - j)^2}{i^2}\right)^{k - k'} \]

标签:sz,简要,OI,int,复杂度,笔记,背包,mathcal,dp
From: https://www.cnblogs.com/cjtcalc/p/16894940.html

相关文章

  • JUC学习笔记——共享模型之不可变
    JUC学习笔记——共享模型之不可变在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的不可变内容我们会分为以下几部分进行介绍:不可变案例不可变设计模式之......
  • PAM 学习笔记
    \(PAM\)回文树(也叫回文自动机),是一个可以存储一个串中所有回文子串的高效数据结构,回文树由转移边与\(fail\)指针构成,每个节点保存一个回文子串。转移边类似\(trie\)上......
  • 第二章读书笔记
    03运行超市抹零结账行为money_all=56.75+72.91+88.50+26.37+68.51money_all_str=str(money_all)print("商品总金额为:"+money_all_str)money_real=int(money_all)money_rea......
  • Python 文本文件拖上转自适应图片 - 学习笔记(2022.11.16)
    Python文本文件拖上转自适应图片功能:1、支持拖拽执行2、文本文件转为自适应尺寸图片1importre2importos3importsys4importtime5fromPI......
  • Win10 笔记本禁用/启用自带键盘
    文章来源:华硕笔记本怎么禁用自带键盘_虽千万里,吾往矣!的博客-CSDN博客_华硕笔记本怎么禁用自带键盘在小娜搜索栏中输入cmd,找到命令提示符(cmd),并且右键以管理员身份运行。......
  • 哈希算法学习笔记 I:XOR hashing
    咕咕中,两天后填坑。CF1175F.TheNumberofSubpermutations求一个序列中是排列的子串数量。CF1746F.Kazaee多组询问,求一个序列的\([l,r]\)段是否为排列。......
  • 【论文笔记】CBIR的最近发展 - Recent developments of content-based image retrieva
    原文地址Abstract随着互联网技术的发展和数字设备的普及,基于内容的图像检索(Content-BasedImageRetrieval,CBIR)迅速的发展、应用,涉及计算机视觉和人工智能的各个......
  • Temporal-Action-Detection-with-Structured-Segment-Networks笔记
    先说说这篇​​论文​​主要研究什么?简而言之,就是对视频中出现的行为进行检测,目标是预测行为的类别和行为所在的时序区间。本文提出了一种结构化的分段网络,这样更容易提......
  • 001-STM32F407+EC200基本控制篇(阿里云物联网平台)-C#,网页,android,微信小程序,单片
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTE_STM32F407/EC200/aliyun.html"frameborder="0"scrolling="auto"width="100%"height="1500"><......
  • 20201307梁辰鱼第12周学习笔记
    MySQL数据库系统14.1MySQL简介MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。......