南外集训Day3
状压dp
特点
- 数据规模小的一类最优化问题。
- 状态满足无后效性,且你无法抽象出一个不是暴力的状态(即你需要对所有点进行求解才能得到答案)。
做法
状压dp多以二进制作为状态,有时多进制。
操作:
有一个数x
-
第k位置为1
x|=1<<k
-
第k位设置为0
(x|(1<<k))^(1<<k)
-
第k位取反
x^(1<<k)
-
判断第k位是否位1
x&(1<<k)>0
-
取最低位1对应的10进制数
x&(-x)
-
去掉x的最低位1
x-(x&(-x)),x&(x-1)
-
取出整数的第k位
(x>>k)&1
……
反正手推即可。
例题
[SCOI2007]排列perm
题目。
题意
给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0)。例如123434有90种排列能 被2整除,其中末位为2的有30种,末位为4的有60种。
思路
套路:把余数开进状态
再把选的数压进状态
这是个板题……
美妙的菜肴
题目。
题意
吃m种菜,每种有一个贡献,连着吃x_i,y_i并且按照x_i,y_i的顺序吃会多c_i的贡献,求最大贡献。
思路
记录吃的菜状态和上一个选的。
卡牌游戏
题目。
思路
差值可以是负数!!!那么我们发现两个人都想让自己的值变大。
dp[i][s]前i次操作,卡牌状态为s,之所以能状压是因为最多用到最好的那m张
我们发现不禁卡牌和禁m张中最差的m张一样,因为这步操作一定会使m张卡牌多出一张,而这张必定选不到。所以我们就保证了每步必定会禁一张。
然后就是这样,很水,直接上即可。
[POI2004]PRZ
题意。
题目
一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时只能分批过,当一组全部过去时,下一组才能接着过. 队伍里每个人过桥都需要特定的时间,当一批队员过桥时时间应该算走得最慢的那一个,每个人也有特定的重量,我们想知道如何分批过桥能使总时间最少.
思路
枚举子集+预处理可以水过。
[NOIP2017 提高组] 宝藏
题目。
思路
环的计数
给定 n 个点 m 条边的简单无向图,求其中环的数量。
思路
dp[s][u]为到u的链有多少条,那么我们看看u到s中的最小点是否有连边以确定权值即可。
序列递推
思路
[Noi2012]随机数生成器
题目。
题意
X[n+1]=(aX[n]+c)mod m, 求X[n] mod g。
思路
矩阵快速幂直接上就行了
由于会爆long long,所以用龟速乘即可
[SDOI2009]HH去散步
题目。
思路
材料分解
题目。
思路
随机交换排序法
题目。
题意
给一个长度为 $n$ $(n\leq 100)$ 的 $0/1$ 串,进行 $k$ $(k \leq 10^9)$ 次操作,每次操作选择两个位置 $i,j$ $(1 \leq i < j \leq n)$,交换 $i,j$ 上的数,求 $k$ 次操作后,该 $0/1$ 串变成非降序列的概率,答案对 $10^9+7$ 取模。