状压dp
C202044zxy
这个作者很懒,什么都没留下…
展开
-
[unknown OJ] 记忆碎片
一、题目点此看题二、解法如果你什么都想不到的话可以搞一个暴力 dpdpdp,设 dp[i][s]dp[i][s]dp[i][s] 为考虑权值前iii小的边,用最小表示法弄出来的状态是 sss 的方案数。什么是最小表示法呢?就是把一个点所属于的并查集标上号用状态表示出来。这种方法可以过 n≤15n\leq 15n≤15 的数据。想出正解首先要知道一个东西,一个数的整数分拆方案数很小(也就是拆成若干个整数之和,不考虑顺序),n=40n=40n=40 的时候方案数是 373383733837338,那么我原创 2020-11-23 17:54:38 · 344 阅读 · 0 评论 -
[unknown OJ] 数列
一、题目点此看题二、解法质因子这么少就指着他状压,设dp[s]dp[s]dp[s]为质因子出现情况的状压(出现0,1,20,1,20,1,2次),然后枚举选的数转移,我们只需要枚举包含的质因子集合就行了。但是会有一个严重的问题,如果是同一个数计入了多个质因子就会炸。考试时候我挂在了这里,下面介绍 oneindark yyds\tt oneindark\space yydsoneindark yyds 的方法。尝试修改状态定义,注意到出现一次的数最多只有666个(如果大于666个原创 2020-10-30 19:55:52 · 132 阅读 · 1 评论 -
[HDU 5304] Eastest Magical Day Seep Group‘s Summer
https://vjudge.net/contest/397200#status/C202044zxy/C/0/原创 2020-10-07 19:43:11 · 144 阅读 · 0 评论 -
CF1242C Sum Balance
https://www.luogu.com.cn/problem/CF1242C原创 2020-10-04 19:50:34 · 205 阅读 · 0 评论 -
玩个球
一、题目二、解法各种卡///玄学神题,设dp[i][j]dp[i][j]dp[i][j]为长度为iii,状态压缩是jjj(000白111黑),转移枚举取最大值就可以了。结合subtask5/6\tt subtask 5/6subtask5/6的特殊dpdpdp(只考虑那一个的位置),就可以拿到858585分的高分。在考虑一下怎么把n=30n=30n=30的数据卡过去,有一个神奇的思路,是基于:∑i=1nmin(2i,Cni)≈1e7\sum_{i=1}^n\min(2^i,C_n^i)≈1e原创 2020-08-26 22:00:08 · 145 阅读 · 0 评论 -
CF913E Logical Expression
一、题目点此看题二、解法原创 2020-08-09 20:09:21 · 147 阅读 · 0 评论 -
CF1209E2 Rotate Columns (hard version)
一、题目点此看题二、解法原创 2020-08-09 15:06:45 · 229 阅读 · 0 评论 -
CF342D Xenia and Dominoes
一、题目点此看题二、解法首先考虑没有空位怎么做,由于只有333行,并且只能填1×21\times21×2的骨牌,可以考虑状压,设dp[i][s]dp[i][s]dp[i][s]为第iii列的状态为sss,前i−1i-1i−1列都已经填满(因为骨牌只能管这一列和上一列)如何转移呢?首先不考虑不能填的格子,那么所有状态都能由上一层的(7−s)(7-s)(7−s)转移过来(横着填,大括号强调上一层的状压),333和666还可以由(7)(7)(7)转移过来(竖着填),777可以由333或666转移过来(横竖原创 2020-08-09 14:52:02 · 225 阅读 · 1 评论 -
CF906C Party
一、题目点此看题二、解法n≤22n\leq22n≤22,可以考虑状压,设dp[s]dp[s]dp[s]为使sss状态里的人全部互相认识的方案数。转移考虑扩展这些全部相互认识的人,枚举一个人选择,把认识他的人全部加入状态中,步数+1+1+1初始化选择单个人介绍得到最开始的状态,如果一开始就全部认识需要特判。#include <cstdio>#include <cstring>#include <iostream>using namespace std;co原创 2020-08-09 08:12:33 · 141 阅读 · 0 评论 -
CF1316E Team Building
一、题目点此看题二、解法原创 2020-08-09 08:05:54 · 137 阅读 · 0 评论 -
CF757D Felicity‘s Big Secret Revealed
一、题目点此看题二、解法原创 2020-08-08 20:53:56 · 179 阅读 · 0 评论 -
CF743E Vladik and cards
一、题目点此看题二、解法答案具有单调性,所以可以先二分,假设二分出来xxx,每个数要选xxx个或者x+1x+1x+1个,由于只有888个数,可以考虑状压。设dp[i][s]dp[i][s]dp[i][s]为考虑到第iii位,已经选出来的数状压为sss的最大额外长度(有多少个是x+1x+1x+1类型的),转移就找到从当前位置开始选某个数x/x+1x/x+1x/x+1次,到达的位置转移即可,预先处理一个表示位置的vectorvectorvector#include <cstdio>#inc原创 2020-08-08 20:41:45 · 185 阅读 · 0 评论 -
CF1073E Segment Sum
一、题目点此看题二、解法很显然的数位dpdpdp,首先可以把答案转化成差分的形式(两个前缀相减)。设dp[i][s]dp[i][s]dp[i][s]为考虑到第iii位,已选的数状态为sss的方案数和方案的和(所以实现中用了pairpairpair),这里注意一下数位dpdpdp的写法,我们是需要考虑是否达到上界和前导000的,这时我们特判一下...原创 2020-08-08 19:12:07 · 213 阅读 · 0 评论 -
CF903F Clear The Matrix
一、题目点此看题原创 2020-08-08 13:23:12 · 169 阅读 · 0 评论 -
CF111C Petya and Spiders
一、题目点此看题二、解法原创 2020-08-06 10:20:37 · 181 阅读 · 0 评论 -
CF377C Captains Mode
一、题目点此看题二、解法由于两队都要最有策略,所以只有最大的mmm个是有用的,看到数据范围只有202020,可以状压。那么进入了喜闻乐见的bpbpbp环节,如果是ppp操作的话自己选一定比随机选更优,不进行bbb操作相当于禁用战斗力最小的一个,所以没影响。设dp[i]dp[i]dp[i]为已选择的状压为iii的最大差值///最小差值(要看轮到的是谁),然后枚举哪一个被操作即可。#include <cstdio>#include <iostream>#include &l原创 2020-08-04 16:27:52 · 292 阅读 · 0 评论 -
CF71E Nuclear Fusion
一、题目点此看题二、解法n,kn,kn,k都很小,可以考虑状压,设dp[i][s]dp[i][s]dp[i][s]为完成目标数组的前iii个,需要用已有数组的状态为sss,状态数本来就不大,所以直接记忆化搜索即可。#include <cstdio>#include <vector>#include <cstdlib>#include <iostream>using namespace std;const int M = 20;string原创 2020-08-03 08:38:19 · 220 阅读 · 2 评论 -
[SCOI2008]奖励关
一、题目点此看题二、解法状压是显然的,设f[i][j]f[i][j]f[i][j]为前iii个关卡得到的物品集合为jjj的最大价值,但是这样可能第iii轮无法到达状态SSS,这样的问题比较难处理,可以考虑改变状态定义。定义f[i][j]f[i][j]f[i][j]为前[1,i−1][1,i-1][1,i−1]关卡取得的状态是jjj,走完后[i,k][i,k][i,k]个关卡获得的最大价值,...原创 2020-04-07 16:10:53 · 132 阅读 · 0 评论 -
CF279D The Minimum Number of Variables
一、题目原创 2020-03-21 10:10:48 · 222 阅读 · 0 评论 -
Balanced Numbers
一、题目点此看题二、解法很容易想到333进制状压,设dp[i][j][k]dp[i][j][k]dp[i][j][k],为还剩iii为,是否顶到上界,当前所有数位的出现情况的333进制状压(000为未出现,111为出现奇数次,222为出现偶数次),然后转移略。我在实现过程中遇到一个问题,就是怎么处理前导零,前导零是不能算进kkk中的,我想到了一个比较巧妙的方法,我们对初始化下手,如果i=n...原创 2020-03-19 10:10:40 · 143 阅读 · 0 评论 -
[PKUSC2018]最大前缀和
一、题目点此看题二、解法本题就是要求所有排列的最大前缀和之和,首先考虑这样一些性质:最大前缀和的每个后缀值一定≥0\geq0≥0,不然可以删去得到更大的。删去最大前缀的每个前缀值一定<0<0<0,不然可以添加得到更大的。设f[i]f[i]f[i]为集合iii满足条件111的方案数,g[i]g[i]g[i]为集合iii满足条件222的方案数,(这里解释一下为什么严格...原创 2020-03-02 12:06:57 · 629 阅读 · 0 评论 -
Dead Ends
一、题目点此看题二、解法看到n≤10n\leq 10n≤10,自然而然第想到了状压。定义dp[s1][s2]dp[s1][s2]dp[s1][s2]为联通情况为s1s1s1,叶子的情况为s2s2s2,初始化dp[2i−1][2i−1]dp[2^{i-1}][2^{i-1}]dp[2i−1][2i−1]为111,然后转移也不难。但是这道题真的这么简单吗?当然不是,考虑下面一种情况。所以...原创 2019-11-20 18:22:22 · 283 阅读 · 0 评论 -
[THUWC2017]随机二分图
一、题目点此看题二、解法这道题一定不要考虑匈牙利算法,要不然暴搜都很难打。0x01 暴力还是讲一讲吧,考试的时候没打出来,枚举每个点匹配另外的一个点,时间复杂度O(n!)O(n!)O(n!)。你可能要问,怎么建边?对于情况一,我们直接建边并把边的概率设为50%50\%50%。对于情况二,我们建出两条单独的边,并把边的概率设为50%50\%50%,等于这两条边可以以50%50\%50...原创 2019-11-14 22:39:50 · 218 阅读 · 0 评论 -
大理石(状压dp)
一、题目点此看题二、解法因为这道题aia_iai很小,考虑状压dpdpdp。将每个颜色是否拼接在一起状压进sss里,设dp[s]dp[s]dp[s]为到达当前状态的最小步数。我们来推导dpdpdp方程,因为交换是相互的,我们规定只能跟左边的元素交换,这时候我们就可以直接把相同的颜色堆在最左边(不能超越其他已经堆在最左边的颜色块)。为什么呢,因为如果不把相同的颜色堆在最左边,中间总会留下...原创 2019-09-24 23:29:02 · 152 阅读 · 0 评论 -
[NOI2015]寿司晚宴
一、题目题意:有[2,n][2,n][2,n]一共n−1n-1n−1个数,两个人分别取子集SSS和TTT,要求不存在x∈S,y∈Tx\in S,y\in Tx∈S,y∈T,使得gcd(x,y)≠1gcd(x,y)=\not 1gcd(x,y)≠1数据范围:对于30%30\%30%的数据,2≤n≤302\leq n\leq302≤n≤30对于100%100\%100%的数据,2≤n≤...原创 2019-08-19 10:23:31 · 447 阅读 · 0 评论 -
国王
国王一、题目及数据范围在n*n的棋盘上放k个国王,国王可攻击相邻的8个格子,求使它们无法互相攻击的方案总数。1<=n<=10,0<=k<=n2二、解法因为n很小,我们考虑状压dp,设dp[i][j][k]表示到第i行,放j个国王,第i行的状态为k的方案数,则有转移dp[i][j][k]+=dp[i-1][j-cnt][pre],其中cnt是k中有多少个国王,pre...原创 2019-07-20 17:48:34 · 751 阅读 · 0 评论