传送门 和网络流有半毛钱关系么…… 可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解 然后是某大佬说的注意点:每个点可以有很多钥匙,而且初始点也有可能有钥匙 //minamoto #include<iostream> #include<cstdio> #include<queue> using namespace std; #define getc() (p1==p2&&…
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复杂 只是存状态有点难想到 思路 因为n最大为12 所以可以想到是状压 因为n<=12 所以可以用邻接矩阵存下图 枚举每个点作为起点开始DFS 注意每次DFS的初始化和赋值问题即可 代码 #include<iostream> #include<cstdio> #include<…
状压+BFS 通过观察数据范围可知,我们应该状压钥匙种类,直接BFS即可 注意,一个点处可能不知有一把钥匙 #include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <queue> using namespace std; bool f[14][14][1200]; int n,m,p,k,s,key[15][15],block1[…
题面 luogu 题解 \(n \leq 15\) 状压 \(f[i][S]\)表示第\(i\)轮,吃过的集合为\(S\) 正着转移好像有点复杂 考虑逆推转移(正着转移应该也行) \(f[i][S]\)表示\([1,i-1]\)轮,吃过的集合为\(S\),第\(i\)轮到第\(k\)轮最大期望得分 Code #include<bits/stdc++.h> #define LL long long #define RG register const int N = 16; using names…
题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词. 游戏的复杂度定义为游戏中所使用的单词长度总和. 编写程序,求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度. 输入输出格式 输入格式: 输入文件的第一行,表示一个自然数N(1≤N≤16),N表示一本字典中包含的单词数量以下的每一行包含字典中的一个单词,每一…
题目传送门 软件补丁问题 题目描述 T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才可以使用.一个补丁在排除某些错误的同时,往往会加入另一些错误. 换句话说,对于每一个补丁 i,都有 2 个与之相应的错误集合 B1[i]和 B2[i],使得仅当软件包含 B1[i]中的所有错误,而不包含 B2[i]中的任何错误时,才可以使用补丁 i.补丁 i 将修复软件中的某些错…
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格.图上其它白色网格均攻击不到.从图上可见炮兵的攻…
题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 但是这玩意儿有后效性,可以用SPFA消去 #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; , INF = 1e9 + ; in…
看成网络流建图想了好久... 实际上5个是可以状压的 设f[i][k]为到第i个围栏状态为k的方案数,因为考虑到重复,设g[i][k]记录i开始,状态为k的孩子有几个 状态转移很好想:f[j][k]=max(f[j-1][(k&15)<<1],f[j-1][(k&15)<<1|1])+g[j][k]; #include<iostream> #include<cstdio> using namespace std; const int N=50…
注意: 一个点可能有多把钥匙,所以把每个点有钥匙的情况状压一下 两个点之间有障碍的情况只给出了单向,存的时候记得存一下反向 b[i][j]表示当前点拥有钥匙的状态,g[x1][y1][x2][y2]表示两点之间门的类型(0表示没有,-1表示墙比较方便),f[i][j][k]表示点(i,j)在拥有k状态钥匙的情况下的最小步数,v[i][j][k]表示f[i][j][k]的状态是否在bfs队列里.然后转移比较类似spfa 以及终于知道为什么这种题会在24题里了-因为24全名"网络流与线性规划二十四题…
题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一条抛物线,选能顺便打掉最多的那个: 然后连样例都过不了... #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #def…
题目简介 n*m的棋盘,对每行放炮,要求每行每列炮数<=2,求方案数%9999973 N,M<=100 题目分析 算法考虑 考虑到N,M范围较小,每一行状态只与前面的行状态有关,考虑状压Dp 算法分析 设dp[i][j][k]表示放了前i行,j列有1个棋子,k列有两个棋子 那么0个棋子就是m-j-k 然后就可以分类讨论了 情况一 第i行不放棋子:直接继承上一行状态,有:f[i][j][k]=f[i-1][j][k] 情况二 第i行只放一个棋子: 1.该棋放在只有一个棋的列上 有f[i][j][…
正解:状压$dp$ 解题报告: 传送门! 什么神仙题昂,,,反正我是没有想到$dp$的呢$kk$,,,还是太菜了$QAQ$ 首先看数据范围,一个4×7的方格,不难想到最多有8个局部极小值,过于显然懒得证了$QwQ$ 然后因为它对相对位置大小有要求,于是考虑按大小顺序枚举 这里考虑从小到大枚举好了$QwQ$ 设$f_{i,j}:$枚举到第$i$个数,局部极小值的状态为$j$的方案数 转移显然就两种 第一种是,放到局部极小值的位置,有$f_{i,j+2^{k}}+=f_{i-1,j}$ 第二种是,不…
题目 传送门:QWQ 分析 因为m很小,考虑把所有状态压成m位二进制数. 那么总状态数小于$ 2^5 $. 如果状态$ i $能转移到$ j $,那么扔进一个矩阵,n次方快速幂一下. 答案是对角线之和,是转移n次后回来的方案数. 代码 #include <bits/stdc++.h> typedef long long ll; ; ; using namespace std; ll tot; int sta[maxn]; struct Matrix{ ll m[maxn][maxn]; Mat…
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个灯的效果. )];//vis[i] : 判断状态i是否被访问过 struct Node { int status;//状态 int minTimes;//来到当前状态按下开关的最小次数 Node(,):status(a),minTimes(b){} }; queue<Node >myqueue;/…
代码如下 #include <bits/stdc++.h> using namespace std; const int dx[]={0,0,1,-1}; const int dy[]={1,-1,0,0}; char s[10]; int mp[66000],state[5][5],st[5][5],ed[5][5],e; int get_hash(int a[5][5]){ int tot=0,p=1; for(int i=1;i<=4;i++) for(int j=1;j<=…
题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......orz 题目链接:https://www.luogu.org/problemnew/show/P4011 输入输出样例 输入样例#1: 4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 3 0 2 4 3 4 1 3 2 3 3 0 3 3 4…
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥. 题目给出独木桥的长度L,青蛙跳跃的距离…
(new )   war2 题解:总体数据而言,我们很容易想到着就是DP啊,我们DP数组,用状态压缩,代表有那些点已经被占领过了,代表上一次我占的是那个.对于每一次状态转移,若当前我们要占领的Portal在占领后有加分,那么就转移加分与基础值的和,否则只转移基础值.最后判断一下当代表的状态已经有占领个了,就记录下当前的最大值. var n,m,tot,cnt,ans,x,y,c:int64; i,j,k:longint; a:array[-100..100]of int64; f,b:array…
只要注意一下细节就毫无难点了,简简单单状态压缩即可. Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 20; const long long mod = 4921057 ; int a[maxn], b[maxn], pos[maxn], sumv[maxn]; long long dp[1 << maxn][maxn]; inline int lowbit…
[状压DP]SCOI2005-洛谷P1896-互不侵犯 (状压例题) 标签(空格分隔): 状压DP 好久没写博客了,真的爽(误) 题目: 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N) 输出格式 所得的方案数 输入 3 2 输出 16 思路: 状压的入门题,做此题前建议先行做玉米地那…
点此看题面 大致题意: 有一个\(N*M\)的四联通迷宫,相邻两个可能互通,可能有一扇门,也可能有一堵墙.对于第\(i\)类的门,你需要有第\(i\)类的钥匙才可以通过.问你从\((1,1)\)到达\((N,M)\)的最短路. 第一步:建图 看到种类数\(≤10\),应该不难想到状压吧!而且,我们还可以给每个格子一个编号(计算方法:\(pos(x,y)=(x-1)*m+y\)). 我们可以用\(key_i\)来表示编号为\(i\)的格子上有的钥匙状压之后的结果,并用\(dis_{i,j}\)来表…
题目链接:https://www.luogu.org/problemnew/show/P3655 不一定对,仅供参考,不喜勿喷,不喜勿喷. 先copy洛谷P3368 [模板]树状数组 2 题解里面一位大佬Lyp10000对差分数组的解释: 来介绍一下差分 设数组a[]={,,,,},那么差分数组b[]={,,,-,} 也就是说b[i]=a[i]-a[i-];(a[]=;),那么a[i]=b[]+....+b[i];(这个很好证的). 假如区间[,]都加上2的话 a数组变为a[]={,,,,},b…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5120 https://www.luogu.org/problemnew/show/P4003 神奇的费用流建图: 首先,网格图,相邻之间有关系,所以先二分染色一下: 然后发现问题就是染色后黑白点之间要完美匹配插头: 所以可以考虑把旋转通过带一些代价变成插头方向的变化: 把一个格子拆成上下左右四个点,分类讨论,连边即可: 然而一开始连边竟然写了100多行...然后T了: 看了看题解代码,突然…
次元传送门:洛谷P1073 思路 一开始看题目嗅出了强连通分量的气息 但是嫌长没打 听机房做过的dalao说可以用分层图 从来没用过 就参考题解了解一下 因为每个城市可以走好几次 所以说我们可以在图上随意走动 所以第一层图就建一个边权为0的图 随意走动不影响 考虑在某个点买入水晶球 建立一条有向边到新图上 边权为-w[i] 指向i所能到达的点(第二层图中) 它表示:假如我选择走了这条边,就是我在这个点买了这个水晶球,我不会反悔,并且我接下来考虑在某个点卖它. 考虑在某个点卖出水晶球 从第二层图建…
洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建议使用while(l <= r),会避免出现答案为 \(r\) 时和答案AFK搞混,样例就是这种情况. 复杂度为 \(O(\log n) \times\) 最短路的复杂度. 二分 + Dijkstra版本,复杂度为 \(O(\log n \times E\log E)\) . #include<s…
题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x:2.求出某区间每一个数的和. 解法:树状数组求前缀和. #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; ; int n; int c[N]; int lowbit(int x) {return x&-x;} void ins(int x,int d)…
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和. #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; ; int n; int c[N]; int lowbit(int x)…
归并排序解法:https://www.cnblogs.com/lipeiyi520/p/10356882.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对.知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目.Update:数据已加强. 输入输出格…
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 没经过一个城市,都会被收取一定的过路费(包括起点和终点).路上并没有收费站. 假设1为暴风城,n为奥格瑞玛,而他的血量最多为b,出发时他的血量是满的.…