题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/problem/P3160 题解 这道题充分暴露了我的菜.. 显然两个局部极小值点不能相邻,所以最多有\(8\)个局部极小值. 然后考虑容斥掉.不能成为局部极小值的限制,那么就变成钦定某些位置一定是局部极小值,其余不限,求方案数. 然后这个可以状压DP,考虑从小到大加入每个数,然后就很好求了. 代码 #in…
题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示意) X . X . X . X . . . . . . . . . X . X . X . X . . . . . . . . . 所以考虑用\(S\)表示各个极小值点是否已填的状态,枚举\(1-n*m\)进行状压\(DP\). 当前填的数有两种选择: (\(1\))填入坑中,这样枚举\(S\)状…
题目 P3160 [CQOI2012]局部极小值 一眼就是状压,接下来就不知道了\(qwq\) 做法 我们能手玩出局部小值最多差不多是\(8,9\)个的样子,\(dp_{i,j}\)为填满\(1~i\)数字,局部小值的状态为\(j\) 第\(k\)个局部极小值填\(i\):\(dp[i][j]=(dp[i][j]+dp[i-1][j^(1<<k-1)])%p\) 不填在局部极小值,显然有些地方不能填\(i\)的,首先还没填的局部极小值不填,其周围也不能填(填\(i\)后后面再填比不符合局部极小…
题目描述 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值. 给出所有局部极小值的位置,你的任务是判断有多少个可能的矩阵. 输入 输入第一行包含两个整数n和m(1<=n<=4, 1<=m<=7),即行数和列数.以下n行每行m个字符,其中“X”表示局部极小值,“.”表示非局部极小值. 输出 输出仅一行,为可能的矩阵总数除以12345678的余数. 样例输入 3 2 X. .. .…
分析 题目要求有且只有一些位置是局部极小值.有的限制很好处理,但是只有嘛,嗯...... 考虑子集反演(话说这个其实已经算是超集反演了吧还叫子集反演是不是有点不太合适),枚举题目给出位置集合的所有超集,计算让这些位置成为局部极小值,而其他位置随意的方案数,这个可以通过DP,从小到大插入每个数解决. 搜索加一些剪枝,然后就过了.. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register int i=(a);i<=(b);++i…
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/problem/P4757 题解 挺神仙的题. 观察到两个重要性质: (1) 只有不影响任何已选方案的时候,才需要去考虑是否要选择\(u\)的子树内往上走的链.(因为链不带权值) (2) 如果要选择\(u\)子树内往上走的链,那么最多选择一条. 由此可知,我们可以记录哪些链在\(u\)子树内的所有方案中是必…
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4417 (luogu)https://www.luogu.org/problemnew/show/P3990 题解: 一看就是矩乘优化dp. 每次跳奇数列?那么我们可以将列两两分组,以两列为一组作为矩阵要记录的状态.一个元素位于组内第一列说明它不可能再跳到这一组的第二列(为了避免算重).转移矩阵的构造见代码. 那么我们用矩阵来表示转移方程: 设向量\(F[i]\)表示状态…
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143 (luogu) https://www.luogu.org/problemnew/show/P3232 题解: 水题.考虑如何求每个点的期望经过次数: 要求\(1\)号点开始\(n\)号点结束,那么\(1\)号点一定一上来就会经过一次,\(n\)号点一共只会经过\(1\)次.因此对于\(1\)到\(n-1\)的每一个点可以列出一个方程,其中\(1\)号点的方程是\…
当然是容斥啦. 用dp预处理出\( f[i] \),表示在\( i \)价格时不考虑限制的方案数,转移方程是\( f[i]+=f[i-c[j]] \),用状压枚举不满足的状态容斥一下即可. #include<iostream> #include<cstdio> using namespace std; const long long N=100005; long long c[10],T,d[10],s,f[N],ans; long long read() { long long…
题意 给出一棵无根树,求本质不同的独立集数模100000000710000000071000000007的值. n≤500000n\le 500000n≤500000 题解 如果是有根树就好做多了.然而无根树可以找重心作为根,转化为有根树. 那么考虑有根树的本质不同的独立集数怎么求. 直接dpdpdp就行了.用f[i][0]f[i][0]f[i][0]表示iii不选的独立集数,f[i][1]f[i][1]f[i][1]表示iii要选的独立集数. 转移的时候要考虑本质是否不同.做法是树hashha…