AcWing P378 骑士放置 题解】的更多相关文章

Analysis 这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置).然后就跑一遍匈牙利算法就好了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 110 using namespace std; inline int read() { ; ; char c=getch…
「CH6901」骑士放置 传送门 将棋盘黑白染色,发现"日"字的两个顶点刚好一黑一白,构成一张二分图. 那么我们将黑点向源点连边,白点向汇点连边,不能同时选的一对黑.白点连边. 当然,障碍点不会被连任何边. 那么我们每割掉一条黑白点之间的边,就会减少 \(1\) 的答案. 那么为了答案最大就是 $n \times m - t - $ 最小割. 参考代码: #include <cstring> #include <cstdio> #include <queu…
题目大意:给定一个 N*M 的棋盘,有一些格子禁止放棋子.问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照"日"字攻击,但没有中国象棋"别马腿"的规则).N, M<=100. 题解:相同的道理,放置一个马就在两个点之间连一条边.求的是二分图的最大独立集,即:二分图点数减去最小点覆盖数即可. 代码如下 #include <bits/stdc++.h> #define f…
http://www.lydsy.com/JudgeOnline/problem.php?id=1085 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务. Input 第一行有一个正整数T(T<=10)…
题目描写叙述 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在不论什么时候一个骑士都能依照骑士的走法(它能够走到和它横坐标相差为1.纵坐标相差为2或者横坐标相差为2.纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,如何才干经过移动变成例如以下目标棋盘: 为了体现出骑士精神.他们必须以最少的步数完毕任务. 输入描写叙述 Input Description 第一行有一个正整数T(T<=10).表示一共同拥有N组数据.接下来有T个5×5的矩…
原题链接 和棋盘覆盖(题解)差不多.. 同样对格子染色,显然日字的对角格子是不同色,直接在对应节点连边,然后就是二分图最大独立集问题. #include<cstdio> #include<cstring> using namespace std; const int N = 1e4 + 10; const int M = 2.6e7 + 10; int fi[N], di[M], ne[M], mtc[N], mo_x[8] = { -1, -2, -2, -1, 1, 2, 2,…
没有什么特别好的办法,只好用搜索去做 因为一次移动最多归位一个骑士 所以可以想到用IDA*,为了简化状态 我们用k,x,y,sum来表示移动了k步,空格在x,y,还用sum个没有归位的情况 然后枚举转移即可 标准的IDA* # include<cstring> # include<iostream> # include<cstdio> # include<cmath> # include<cstdio> # include<algorith…
双向BFS (广搜) \(O(8 ^ 7)\) 看到没有双向BFS的题解我就过来了 这道题也可以用双向\(BFS\)来做,时间复杂度与\(IDA*\)不相上下. 双向\(BFS\)的实现有多种: 把初始状态和目标状态扔在一个队列里,每次从队列里搞出来一个扩展 把初始状态和目标状态扔在两个队列里,每次选一个队列中元素少的拓展. 把初始状态和目标状态扔在两个队列里,每次分别从两个队列中取出一个元素拓展. 这里使用了方法\(1\). 时间复杂度分析:每次会扩展\(8\)个状态,最多扩展\(\lfloo…
Analysis 首先假设一天的第N小时与后一天的第一个小时不相连, 这种情况下DP转移比较好想 dp[i][j][0/1]dp[i][j][0/1]表示 考虑一天的前i个小时,已经休息了j小时,且第i个小时是否在休息 那么有状态转移方程: dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]); dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j-1][1]+a[i]); 初始化为dp[1][0][0]=dp[1][1][1]=…
每日一题 day21 打卡 Analysis DP的状态为已经完成的请求数量,通过指派一位服务员可以把”完成i - 1个请求的状态”转移到”完成i个请求的状态”那么我们可以知道转移从dp[i - 1] -> dp[i]dp[i][x][y][z] 代表为第i次选择的情况下,对应的1,2,3号服务员所对应的位置那么可以得知dp[i][arr[i]][y][z] = min(dp[i][arr[i]][y][z], dp[i - 1][x][y][z] + cost[x][arr[i]])dp[i]…