「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整除,其中末位为 2 的有 30 种,末位为 4 的有 60 种. 输入格式 输入第一行是一个整数 TTT,表示测试数据的个数,以下每行一组 s 和 d,中间用空格隔开.s 保证只包含数字 0,1,2,3,4,5,6,7,8,9 输出格式 每个数据仅一行,表示能被 d 整除的排列的个数. 输入输出样例…
题意 你有一个\(h\times w\)的棋盘,你需要在每个格子里填\([1, m]\)中的某个整数,且满足\(n\)个矩形限制:矩形的最大值为某定值.求方案数\(\bmod 10^9+7\) \(h, w, m\leq 10^4,n\leq 10\) 题解 首先来考虑单独的一个矩形限制怎么做.假设矩形面积为\(s\),最大值为\(v\) 易得答案是\(v^{s}-(v-1)^{s}\),意思就是每个数随便选,然后减去所有数\(<v\)的方案 现在考虑\(n\)个限制,实际上把棋盘分成了\(O(…
题意 给一个长度为\(n(\leq 300)\)的\(01\)串,每次可以把\(k(\leq 8)\)个相邻字符合并,得到新字符和一定分数,最大化最后的得分 题解 考虑设计dp:\(dp[S][i][j]\)表示区间\([i, j]\)合并为\(S\),最大得分是多少. 这么考虑一定是不遗漏的.如果\([i, j]\)留下来的区间长度\(>k\),那这个合并方案一定会在包含它的大区间计算到,所以我们只考虑能合并都合并完的情况 枚举缩完最后一个位是啥,这对应\([i, j]\)的一个长度\(\bm…
题意 求一个\(1\sim n\)的排列LIS的期望长度,\(n\leq 28\) 题解 考虑朴素的LIS:\(f[i] = min(f[j]) + 1\) 记\(mx[i]\)为\(f\)的前缀最大值,那么可以得到一个性质\(mx[i + 1] \in [mx[i], mx[i] + 1]\) 对\(mx\)数组进行差分,则差分数组只有\(01\),可以状压 由于\(mx[1] - mx[0]=1\),从第二位开始状压 然后考虑从\(1\sim i\)的排列推到\(1\sim i+1\)的排列…
传送门 >Here< 题意:用1*2的砖块铺满n*m的地板有几种方案 思路分析 状压经典题! 我们以$f[i][j]$作为状态,表示第i行之前全部填完并且第i行状态为j(状压)时的方案数. 我们考虑,对于一个格子,一块砖有3种方法. (一):横着放.对下一行没有任何影响 (二):竖着放,并且当前这一格作为砖块的下层.那么对下一行也没有任何影响 (三):竖着放,并且当前这一格作为砖块的上层.这种情况对下一行很明显是有影响的. 综上,只有情况3是对下一行有影响的. 所以我们需要一种方法来区分前两种…
题意 你有\(n\)个物品,物品和硬币有\(A\),\(B\)两种类型,假设你有\(M\)个\(A\)物品和\(N\)个\(B\)物品 每一轮你可以选择获得\(A, B\)硬币各\(1\)个,或者(硬币足够)花\(\max(a_i - M, 0)\)个\(A\),\(\max(b_i - N, 0)\)个\(B\)买\(i\)这个物品 问买到所有物品最少要多少轮 题解 巧妙的\(dp\),考虑间接设计状态 \(f[S][A] = B\)表示\(S\)这个集合买过了,\(A\)类花\(\sum a…
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/problemnew/show/P3264 题解: 终于写出来斯坦纳树了.. 我一直不明白的地方是: spfa那种转移为什么是直接加边权?为什么没有一些特殊情况(如从根转移到儿子)不是加边权?后来觉得大概是因为那种特殊情况如果出现,则一定会在枚举子集的转移中被转移到. 做法就是,先对每个特殊点的子集求出来最小…
[题解] 思维题,看了别人的博客才会写. 写出这样的矩阵: 1,3,9,... 2,6,18,... 4,12.36,... 8,24,72,... 我们要做的就是从矩阵中选出一些数字,但是不能选相邻的. 我们可以发现,在100000的范围内,这个矩阵最多只有18行,11列. 那么这个矩阵的取数字的方案数直接状压DP即可.f[i][j]表示第i行,状态为j的方案数,转移就是f[i][j]=sigma(f[i-1][k]) ,条件是(j&k==0且k&(k>>1)==0) 但是这…
题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <set>…
BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f[i][s]=f[i-1][s]+dis[i]\)),然后再和不去\(i\)商店的\(f[i-1]\)取个\(\min\). 复杂度是\(O(nm2^m)\)吗... 可以优化,处理\(f[s]\)表示在某家商店买\(s\)集合的物品的最小代价.然后令\(g[s]\)表示考虑所有商店买\(s\)集合…