随笔分类 -  动态规划 - 状压dp

摘要:令 $f[S]$ 表示所选的排列可以生成出 $S$ 的最大独立集且点集 $S$ 全部在序列中的方案数. 那么我们选一个没有被覆盖的点 $j$,令 $sta[j]$ 表示 $j$ 及 $j$ 覆盖的点集. 那么有 $f[S|sta[j]] \leftarrow f[S] \times A(n-|S|- 阅读全文
posted @ 2020-07-23 21:40 EM-LGH 阅读(159) 评论(0) 推荐(0)
摘要:对于 $x,y$ 如果 $x$ 在 $y$ 的左面那么 $x \rightarrow y$ 的贡献是 $pos[y]-pos[x]$ $y \rightarrow x$ 的贡献是 $pos[x] \times k+pos[y] \times k.$ 令 $f[S]$ 表示集合 $S$ 在序列开头,且 阅读全文
posted @ 2020-07-23 17:00 EM-LGH 阅读(165) 评论(0) 推荐(0)
摘要:这个状压状态时显然的,但是总状态数有 $\binom{K}{P}$. 好在题目中有一个要求,就是每个格子必须经过一次,所以说我们压缩的长度为 $P$ 的状态中首位必为 1. 那么状态数就减小为 $\binom{K-1}{P-1}$,来一个矩阵乘法就行了. code: #include <cstdio 阅读全文
posted @ 2020-06-02 10:44 EM-LGH 阅读(177) 评论(0) 推荐(0)
摘要:我们发现最多只会用 n 个背包. 令 $f[S]$ 表示装完 $S$ 的物品所需最少背包数量. 令 $g[S]$ 表示满足 $f[S]$ 的情况下剩余的最大重量. 转移略复杂,细节比较多. code: #include <bits/stdc++.h> #define N 24 #define inf 阅读全文
posted @ 2020-06-02 09:11 EM-LGH 阅读(123) 评论(0) 推荐(0)
摘要:思路比较自然. 开始的时候有一个地方糊涂了,后来想清楚就好了. 这里注意一个地方: 令 $f[S]$ 表示 $S$ 集合的所有排列中 sum(S) 为最大值的排列数. 然后转移 $f[S]$ 的时候要把新的元素放到序列开头,因为放到结尾的话前面的前缀可能非常小,导致到达不了结尾. code: #in 阅读全文
posted @ 2020-05-27 16:37 EM-LGH 阅读(172) 评论(0) 推荐(0)
摘要:这个题求完斯坦纳树后再搞一个类似于子集 DP 就行了. 我写的好像有点麻烦,但本质是相同的. code: #include <bits/stdc++.h> #define N 3006 #define M 13 #define inf 0x3f3f3f3f #define ll long long 阅读全文
posted @ 2020-03-12 20:28 EM-LGH 阅读(153) 评论(0) 推荐(0)
摘要:有 $2^n$ 名选手,编号为 $1$ 至 $2^n$. 现在这 $2^n$ 名选手将进行 $n$ 轮淘汰赛,决出胜者. 若 $x<y$,则 $x$ 能战胜 $y$. 但是有 $m$ 个例外,1 号选手会输给这 $m$ 个选手,问有多少种初始排列方式使得 $1$ 号点能取得胜利. (每次是 2i v 阅读全文
posted @ 2020-01-07 16:17 EM-LGH 阅读(301) 评论(0) 推荐(0)
摘要:这个题和那个城市规划几乎是一个套路. 就是钦定一个点,然后枚举这个点所在连通块大小,然后其余部分随便连. 由于我们钦定了一个点,所以我们算的方案数肯定不会重复. 即 $f[S]=TOT(S)-\sum_{T \subseteq S} f(T) \times TOT(S-T)$. code: #inc 阅读全文
posted @ 2020-01-06 16:42 EM-LGH 阅读(170) 评论(0) 推荐(0)
摘要:好神啊 ~ 打表程序: #include <cstdio> #include <cstring> #include <algorithm> #define N 140000000 #define ll long long #define mod 998244353 #define setIO(s) 阅读全文
posted @ 2019-12-19 14:07 EM-LGH 阅读(136) 评论(0) 推荐(0)
摘要:思路很巧妙的一道题 ~ 这个应该不完全是正解,复杂度约为 $O(3\times 10^8)$,有时间再研究研究正解. 首先,最裸的暴力是按照权值从小到大枚举每一个数,然后枚举后面的数来更新方案数,是 $O(n^2)$ 的. 然后,我们可以用lucas定理来模拟那个组合数,会发现只需满足大数&小数=小 阅读全文
posted @ 2019-12-17 16:20 EM-LGH 阅读(245) 评论(0) 推荐(0)
摘要:挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 $\sqrt 500$ 的质因子(两个的话乘积就超过 500 了) 而不大于 $\sqrt 500$ 阅读全文
posted @ 2019-12-02 20:59 EM-LGH 阅读(177) 评论(0) 推荐(0)
摘要:比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: #include <bits/stdc++.h> #define N 21 #define LL 阅读全文
posted @ 2019-11-06 20:59 EM-LGH 阅读(140) 评论(0) 推荐(0)
摘要:code: #include <bits/stdc++.h> #define N 1005 using namespace std; void setIO(string s) { string in=s+".in"; string out=s+".out"; freopen(in.c_str()," 阅读全文
posted @ 2019-11-06 19:45 EM-LGH 阅读(118) 评论(0) 推荐(0)
摘要:题意:给定一个序列,每个位置有 $t_{i},b_{i}$ 两个属性,分别代表该点的权值,和 $i$ 后面只允许不超过 $i+b_{i}$ 在 $i$ 前打饭. 而每一次 $i$ 打饭的代价为 $上一个打饭位置t_{上一个打饭位置}$ ^ $t_{i}$ 求一种分配打饭的先后顺序,使得总代价最小. 阅读全文
posted @ 2019-11-06 17:04 EM-LGH 阅读(146) 评论(0) 推荐(0)
摘要:思路比较直接. 由于 $n$ 很小,直接定义 $f[i][j]$ 表示当前在自动机中的节点 $i,$ 被覆盖串的集合为 $j$ 的方案数. 阅读全文
posted @ 2019-09-19 19:07 EM-LGH 阅读(163) 评论(0) 推荐(0)
摘要:题解: $k<=20,$ 考虑状压dp. 从 $1$ 号点走到 $n$ 号点经过的点的个数可能会非常多,但是强制要求经过的点一共才 $20$ 个. 而我们发现这个题好就好在可以经过某个城市,而不停留. 故我们在关键点之间进行转移的时候可以直接走最短路,而不用管别的. 令方程 $f[i][j]$ 表示 阅读全文
posted @ 2019-09-18 19:11 EM-LGH 阅读(163) 评论(0) 推荐(0)
摘要:开始读错题了,然后发现一眼切~ Code: 阅读全文
posted @ 2019-08-28 09:10 EM-LGH 阅读(169) 评论(0) 推荐(0)
摘要:Code: 阅读全文
posted @ 2019-07-23 12:48 EM-LGH 阅读(224) 评论(0) 推荐(0)
摘要:Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时只能分批过,当一组全部过去时,下一组才能接着过. 队伍里每个人过桥都需要特定的时间,当一批队员 阅读全文
posted @ 2019-06-06 20:23 EM-LGH 阅读(198) 评论(0) 推荐(0)
摘要:Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Farmer John would like to milk as many of his N (1 < 阅读全文
posted @ 2019-06-06 20:01 EM-LGH 阅读(198) 评论(0) 推荐(0)