题目:https://www.luogu.org/problemnew/show/P3112 状压dp.发现只需要记录当前状态的牛中剩余承重最小的值. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ,Lm=(<<)+,INF=1e9+; ; ll h,dp[Lm]…
题目描述 Farmer John and his herd are playing frisbee. Bessie throws the frisbee down the field, but it's going straight to Mark the field hand on the other team! Mark has height H (1 <= H <= 1,000,000,000), but there are N cows on Bessie's team gathere…
题目描述 Farmer John and his herd are playing frisbee. Bessie throws the frisbee down the field, but it's going straight to Mark the field hand on the other team! Mark has height H (1 <= H <= 1,000,000,000), but there are N cows on Bessie's team gathere…
洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层有关,所以如果我们能够将一层的边一起加进去,计算就会方便许多.于是想办法把这个转移过程状压一下. 设\(f_{i,j}\)为当前已选点集为\(i\),下一层加入的点集为\(j\)时,新加入的所有点与原有点之间最小的边权之和.计算的具体实现,我们\(O(2^n)\)枚举\(i\),再枚举\(i\)的补…
题目描述 Farmer John and his herd are playing frisbee. Bessie throws the frisbee down the field, but it's going straight to Mark the field hand on the other team! Mark has height H (1 <= H <= 1,000,000,000), but there are N cows on Bessie's team gathere…
题意翻译 FJ将飞盘抛向身高为H(1 <= H <= 1,000,000,000)的Mark,但是Mark被N(2 <= N <= 20)头牛包围.牛们可以叠成一个牛塔,如果叠好后的高度大于或者等于Mark的高度,那牛们将抢到飞盘. 每头牛都一个身高,体重和耐力值三个指标.耐力指的是一头牛最大能承受的叠在他上方的牛的重量和.请计算牛们是否能够抢到飞盘.若是可以,请计算牛塔的最大稳定强度,稳定强度是指,在每头牛的耐力都可以承受的前提下,还能够在牛塔最上方添加的最大重量. 题目描述 F…
题目描述 FJ将飞盘抛向身高为H(1 <= H <= 1,000,000,000)的Mark,但是Mark 被N(2 <= N <= 20)头牛包围.牛们可以叠成一个牛塔,如果叠好后的高度大于或者等于Mark的高度,那牛们将抢到飞盘. 每头牛都一个身高,体重和耐力值三个指标.耐力指的是一头牛最大能承受的叠在他上方的牛的重量和.请计算牛们是否能够抢到飞盘.若是可以,请计算牛塔的最大稳定强度,稳定强度是指,在每头牛的耐力都可以承受的前提下,还能够在牛塔最上方添加的最大重量. 输入输出样…
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式: 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) 输出格式: 所得的方案数 输入样例 3 2 输出样例 16 题(mang)目(mu)分析: 爆裂吧!!!五重循环!!!! 我们用三维数组dp[i][j][l] 表示前i行共放了l个king 且第i行状态为j的方案数 先把只考…
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. 定义状态:一个二进制数某一位为\(1\)表示该位放了国王,反之亦然. 设\(f[i][j][k]\)表示,前\(i\)行,已经放了\(j\)个国王,并且第\(i\)的状态为\(k\)时的方案数. 直接枚举所有状态显然不可行,于是可以先预处理去所有相邻两格不矛盾的状态,也就是每一行可能出现的状态.…
[题解] 思维题,看了别人的博客才会写. 写出这样的矩阵: 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) 但是这…
点此看题面 大致题意: 用随机算法求一张图的最大独立集:每次随机一个排列,从前到后枚举排列中的点,如果当前点加入点集中依然是独立集,就将当前点加入点集中,最终得到的点集就是最大独立集.求这个随机算法的正确率. 前言 \(PKUWC\)的题目就是妙啊. 题目很神仙,但看完题解后就很简单了,可这种东西像我这般蒟蒻根本想不到啊...... 状压\(DP\) 设\(f_{i,j}\)表示当前已考虑过点集\(i\),最大独立集为\(j\)的方案数. 每次我们枚举一个不在点集中的点\(k\),设与其相邻的点…
题目:https://www.luogu.org/problemnew/show/P2396 题意:有n个数,每次选择一个表示走$a[i]$步,每个数只能选一次. 最多有两个厄运数字,如果走到了厄运数字就不能继续走下去了. 选完所有数有多少种方案. 思路:n很小,状压. 用state表示已经选了哪几个数.如果state是厄运数字就continue 不是的话state就需要加上所有是1的,这道题卡常,所以可以用上lowbit.再开O2优化. #include<cstdio> #include&l…
题目描述 输入输出样例 输入 #1 复制 12 4 1 3 2 4 2 1 2 3 1 1 3 4 输出 #1 复制 7 说明/提示 分析 首先要注意合唱队排好队之后不一定是按\(1.2.3......m\)的顺序的 \(N\)的范围很大,但\(m\)的数据比较小,所以我们考虑装压DP 我们设\(f[i]\)为状态为\(i\)的合唱队已经安排好位置的最小花费 接下来就是状态转移方程的问题 for(int i=1;i<(1<<m);i++){ int len=0; for(int j=1;…
题面传送门 现场人傻系列-- 首先建出 \(E\) 的表达式树,具体来说表达式的每一个叶子节点表示一个数组 \(A_i\),每一个非叶子节点都表示一次运算,它的值表示左右儿子进行该运算后得到的结果.这个可以通过建表达式树的套路方法在 \(\mathcal O(|E|)\) 的时间内求出来. 其次注意到数组每一位的贡献是独立的,也就是说我们可以对 \(n\) 位每一位都单独求一遍贡献.于是现在等价于我们解决 \(n\) 个如下的问题: 给出一个数组 \(a_1,a_2,\cdots,a_m\) 和…
->题目链接 题解: 贪心+模拟 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; ; ],w[],s[],f[(<<)+],g[(<<)+],ans=-; int main() { scanf("%d%d",&n,&H); ; i<=n-; i++…
点此看题面 大致题意: 有一个\(N*M\)的四联通迷宫,相邻两个可能互通,可能有一扇门,也可能有一堵墙.对于第\(i\)类的门,你需要有第\(i\)类的钥匙才可以通过.问你从\((1,1)\)到达\((N,M)\)的最短路. 第一步:建图 看到种类数\(≤10\),应该不难想到状压吧!而且,我们还可以给每个格子一个编号(计算方法:\(pos(x,y)=(x-1)*m+y\)). 我们可以用\(key_i\)来表示编号为\(i\)的格子上有的钥匙状压之后的结果,并用\(dis_{i,j}\)来表…
传送门 我数学期望还是太差了…… 先考虑状压模型,设$dp[i][S]$表示第$i$轮,当前宝物状态为$S$,能获得的最大期望分数 然而这个模型有一个问题,第$i$轮不一定能达到状态$S$ 那么考虑转化一下,$dp[i][S]$表示第$1$至$i-1$轮的宝物状态为$S$,第$i$至$n$轮的期望分数 那么我们就可以倒推了 那么对于第$k$个宝物,可以分为两种情况 1.可以选,那么此时可以选择选或者不选,则$dp[i][S]+=max\{dp[i+1][S],dp[i+1][S|(1<<k-1…
题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; ll <<),inf=1e18; ll n,H,h[],w[],s[],f[maxn…
上个月写的题qwq--突然想写篇博客 题目: 洛谷4294 分析: 斯坦纳树模板题. 简单来说,斯坦纳树问题就是给定一张有边权(或点权)的无向图,要求选若干条边使图中一些选定的点连通(可以经过其他点),且边权(或点权)之和最小.很明显,这样最终形成的是一棵树. 通常,斯坦纳树问题规模都比较小.考虑状压DP.用\(dp[u][S]\)表示让点\(u\)与集合\(S\)中所有关键点连通的最小花费.有如下两种转移: 第一,把两条到\(u\)的路径拼在一起,减去重合点\(u\)的点权,即(\(w_u\)…
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复杂 只是存状态有点难想到 思路 因为n最大为12 所以可以想到是状压 因为n<=12 所以可以用邻接矩阵存下图 枚举每个点作为起点开始DFS 注意每次DFS的初始化和赋值问题即可 代码 #include<iostream> #include<cstdio> #include<…
洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与普通状压并无多大区别 详细见代码 代码 #include<iostream> using namespace std; #define maxn 1010 ][maxn][maxn],num[maxn],st[maxn],map[]; int n,m,ans,state; int get(int…
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识点参考: https://blog.csdn.net/fox64194167/article/details/20692645 思路 看数据识算法系列 我们用f[i][j][k]来表示第i行为状态j 并且前i行已经放了k个国王 对于状态我们可以先预处理出来 因为每个格子有放和不放两种选择 那么我们可…
洛谷题面传送门 首先看到 LIS 我们可以想到它的 \(\infty\) 种求法(bushi),但是对于此题而言,既然题目出这样一个数据范围,硬要暴搜过去也不太现实,因此我们需想到用某种奇奇怪怪的方式进行状态压缩 DP,这样一来就可以排除掉不少常用的求 DP 的方法:譬如最常用的从左往右顺着钦定元素并设 \(f_i\) 表示以 \(i\) 结尾的 LIS 的长度的方法,因此考虑换个角度,从小到大添加元素.还是设 \(f_i\) 表示以 \(i\) 结尾的 LIS 的长度,那么考虑在一轮中,我们在…
[状压DP]SCOI2005-洛谷P1896-互不侵犯 (状压例题) 标签(空格分隔): 状压DP 好久没写博客了,真的爽(误) 题目: 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) 输出格式 所得的方案数 输入 3 2 输出 16 思路: 状压的入门题,做此题前建议先行做玉米地那…
洛谷题目传送门 一血祭 向dllxl致敬! 算是YNOI中比较清新的吧,毕竟代码只有1.25k. 首先我们对着题意模拟,寻找一些思路. 每次选了一个最大的数后,它和它周围两个数都要减一.这样无论如何,我们都选不到旁边那两个数,只有第一次选的那个数会对答案产生它的大小的贡献. 于是就可以写出一个\(O(nm\log n)\)的暴力用来对拍了 #include<bits/stdc++.h> #define LL long long #define R register int #define G…
原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 $n$ 个节点 $m$ 条边的无向图. 现在请你在这个图之上生成一个有根树. 记 $d_i$ 为节点 $i$ 的深度 $(d_{root}=0)$ ,记 $fadis_i$ 为节点 $i$ 到其父亲节点的连边中的最小边权. 则这棵树的代价为 $$\sum_{i=1}^{n}(d_i\times fa…
原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第$i$个元素有$a_i$.$b_i$.$c_i$三个属性,设$f(i)$表示满足$a_j\leq a_i$且$b_j\leq b_i$且$c_j\leq c_i$的$j$的数量.对于$d\in [0,n)$,求$f(i)=d$的数量. $n\leq 100000,max\{a_i,b_i,c_i|i…
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度. 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小.请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小…
次元传送门:洛谷P1966 思路 显然在两排中 每排第i小的分别对应就可取得最小值(对此不给予证明懒) 所以我们只在意两排的火柴是第几根 高度只需要用来进行排序(先把两个序列改成有序的方便离散化) 因此我们对火柴的高度进行离散化 把火柴高度变为1到n的序列 然后我们只需要对一个序列a固定 求另一个序列b相对于前一个序列a的逆序对即可 举个栗子…
题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\forall a \le b \le c \le d\)有 \[val(a,d) + val(b,c) \ge val(a,c) + val(b,d)\] 那么我们称函数\(val(i,j)\)满足四边形不等式 一般地,当我们需要证明一个函数\(val(i,j)\)满足四边形不等式时,只需证对于\(\fo…