状压
ModestCoder_
一个modest的coder
展开
-
【题解】LuoGu6289:Vještica
原题传送门这题可以想出很多性质n<=16n<=16n<=16暗示的非常明显,我后来才意识到是状压对于一堆字符串,显然,我们可以先把它们共有的部分弄掉,剩下的不存在共有的部分我可以状压dpidp_idpi表示状态iii的答案枚举iii的子集jjj,表示先把jjj和i−ji-ji−j内部先算好答案所以两部分的答案加起来的时候总共共有的部分重复算了一遍要减掉令sum=总共的共有部分sum=总共的共有部分sum=总共的共有部分dpi=min(dpj+dpi−j−sum)dp_原创 2020-10-25 18:08:22 · 168 阅读 · 0 评论 -
【题解】CSP-S2019初赛:取石子
(取石子)Alice和Bob两个人在玩取石子游戏。他们制定了nn条取石子的规则,第ii条规则为:如果剩余石子的个数大于等于a[i]a[i]且大于等于b[ilb[il, 那么他们可以取走b[i]b[i]个石子。他们轮流取石子。如果轮到某个人取石子, 而他无法按照任何规则取走石子,那么他就输了。一开始石子有mm个。请问先取石子的人是否有必胜的方法?有两种做法暴力dp:dpidp_idpi表示iii是否必胜,对于一个规则(a,b)(a<=i),dpi∣=(dpi−b==0)(a,b)(a<=i原创 2020-09-30 21:46:28 · 2019 阅读 · 0 评论 -
【题解】CF906C:Party
原题传送门状压01状态中所有1表示互相认识staista_istai表示初始iii的交际圈,如果iii在状态JJJ中,可以直接把staista_istai的状态直接并入JJJ,表示选择iii,把他认识的人都互相认识一遍然后记录路径,idJid_JidJ表示该状态是通过选择idJid_JidJ这个人来的,preJpre_JpreJ表示上个状态Code:#include <bits/stdc++.h>#define maxn 5000010#define maxm 25u原创 2020-09-16 21:26:33 · 251 阅读 · 0 评论 -
【题解】Kronican
题目描述Mislav有N个无限体积的杯子,每一个杯子中都有一些水。Mislav想喝掉所有的水,但他不想喝超过K杯水。Mistrav能做的就是将一个杯子中的水倒入另一个杯子中。 不幸的是,挑选哪两个杯子进行倒水操作对Mislav来说很重要,因为并非所有的杯子都离他一样远。更准确地说,从i号杯子向j号杯子倒水所付出的代价为Cij。 帮助Mislav找到他需要付出的总代价的最小值。输入格式第一行输入包含整数N和K(1≤K≤N≤20)。表示水杯的总数和Mislav最多能喝多少杯。 接下来N行每行包含N个整数C原创 2020-09-16 11:10:42 · 279 阅读 · 0 评论 -
【题解】UVA10817:Headmaster‘s Headache
@vjudge记录有0、1、2个老师教的课的状态s0,s1,s2s0,s1,s2s0,s1,s2,并记录当前枚举到第几个老师tttdfs(t,s0,s1,s2)dfs(t,s0,s1,s2)dfs(t,s0,s1,s2)用记忆化,状态方面,s0,s1,s2s0,s1,s2s0,s1,s2中保存两个就好了,剩下一个用另外两个算出来,所以状态合理Code:#include <bits/stdc++.h>#define maxn 310#define maxm 210using nam原创 2020-09-13 16:31:45 · 213 阅读 · 0 评论 -
【题解】UVA1252:Twenty Questions
@vjudge状压可以这样设计状态dfs(s,a)dfs(s,a)dfs(s,a)表示当前已经猜测的集合,目前还没有确定的数在sss集合里面的共同特征为aaa,还要猜几次枚举下一次猜的位为kkk对于当前状态的答案是sum=max(dfs(s∣2k,a),dfs(s∣2k,a∣2k))+1sum=max(dfs(s|2^k,a),dfs(s|2^k,a|2^k))+1sum=max(dfs(s∣2k,a),dfs(s∣2k,a∣2k))+1对于每个kkk,取答案的最小值至于边界,若满足状态(s原创 2020-09-13 15:34:04 · 207 阅读 · 0 评论 -
【题解】LuoGu2473:奖励关
原题传送门dpi,jdp_{i,j}dpi,j表示到第iii轮,111~i−1i-1i−1轮取得奖励集合为jjj的答案顺推的话会推出一些不合理的结果,所以采用逆推对于枚举一个kkk号奖励,如果当前满足前置条件dpi,j+=max(dpi+1,j,dpi+1,j∣=(1<<k−1)+pk)dp_{i,j}+=max(dp_{i+1,j},dp_{i+1,j|=(1<<k-1)}+p_k)dpi,j+=max(dpi+1,j,dpi+1,j∣=(1<<k−1)原创 2020-08-21 21:13:07 · 195 阅读 · 0 评论 -
【题解】LuoGu3943:星空
原题传送门因为这个k<=8k<=8k<=8所以想到状压主要思想是差分令灯暗为1,灯亮为0比如一行灯的情况是a:01001100a:01001100a:01001100那么对应差分数组就是b:011010100b:011010100b:011010100可以发现ai=b1xorb2xor...xorbia_i=b_1xorb_2xor...xorb_iai=b1xorb2xor...xorbi然后我对于区间[l,r][l,r][l,r]进行反转操作,在差分数组里的表原创 2020-09-09 16:24:51 · 195 阅读 · 0 评论 -
【题解】10.31模拟赛T1:世界树的考验
solution重要思想:边权转化为点权。定义点权为所有与之相连的边边权亦或和把问题转化为把所有点权变为0的最小次数证明可行:最终态所有点权为0。任何时刻必定存在度数为1的点并把它删掉,相当于删掉一条边,最终可以删光。一次操作选择两个点,只会改变这两个点的权值,中途的点权并不会变。因为中途的点旁边连着两条边,亦或两遍不变所以先把点权相同的点对删掉,然后剩下互不相同的点,通过状压跑一个...原创 2019-11-01 20:51:21 · 258 阅读 · 0 评论 -
【题解】LuoGu3959/noip2017:宝藏
原题传送门状压dpdp[i][j][s]dp[i][j][s]dp[i][j][s]表示当前在j节点,j到起点距离为i,从j开始挖的点的集合为s的最小代价所以我们要先保证j不属于s,再枚举出一个属于s的集合s2,在s2里枚举出一个属于s2的点k,S1记为s2-{k},S2记为s−s2s-s2s−s2状态转移方程:dp[i][j][s]=min(dp[i+1][k][S1]+dp[i][j...原创 2018-10-03 11:50:06 · 321 阅读 · 0 评论 -
【题解】LuoGu2831/noip2016:愤怒的小鸟
原题传送门【题解】我先想到了dfs,估计了一下时间复杂度,估不出来,觉得悬,就“瞟了一眼”题解,发现第一篇就是dfs,然后信心满满的码好,莫名wa掉,找了很长时间错也没找出来。然后我又想起一年前某位老师讲状压dp的时候讲过这道题,就改用了状压dpdp[i]表示猪的状态为i时,用掉的鸟的最小值。对于i,比如i=1001,那么表示第1、4只猪死掉了预处理:num[i][j]表示过i,j两只...原创 2018-09-24 18:16:32 · 294 阅读 · 0 评论 -
【题解】LuoGu3052:[USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
原题传送门 题目描述A little known fact about Bessie and friends is that they love stair climbing races. A better known fact is that cows really don’t like going down stairs. So after the cows finish racing ...原创 2018-08-23 17:12:00 · 335 阅读 · 0 评论