P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第\(i\)行中从左到右第\(j\)列的格子上的两个整数记作\(A_{i,j},B_{i,j}\) .在游戏结束后,菲菲和牛牛…
题目 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第i 行中从左到右第j 列的格 子上的两个整数记作\(A_{i,j}\).\(B_{i,j}\).在游戏结束后,菲菲和牛牛会分别计算自己的得分:菲菲的得分是所有有黑棋的格子上的 \(A_{i,j…
题目链接:https://www.luogu.org/problemnew/show/P4363 分析: 首先博弈,然后考虑棋盘的规则,因为一个子在落下时它的上面和左面都已经没有空位了,所以棋子的右下的轮廓线一定是个凸包,更具体地,从棋盘的左下沿着棋盘边界或棋子轮廓线走到棋盘右上,所走的路径一定只有向上和向右两种. 代码: #include<cstdio> using namespace std; const int maxn=25,N=1<<20,INF=0x3f3f3f3f;…
发现数据范围很小,想到状压dp,然后就愣住不会了. 表示太菜了并没有接触过轮廓线dp这种操作. 首先发现合法的操作过程中一定是这样子的: 按照行来看发现每一行单调不递增. 我们用$1$来表示竖着的轮廓线,用$0$来表示横着的轮廓线,那么来看一下样例,一个棋子都没有放的状态是$00011$,而在唯一的$(1, 1)$位置放上第一个棋子之后状态就变成了$00101$. 其实是这么画出来的:      这样子就发现其实一个$1$后面有多少个$0$就代表放到了第几个,因为每一行是单调不递减的我们就可以从…
BZOJ 洛谷P4363 [Update] 19.2.9 重做了遍,感觉之前写的有点扯= = 首先棋子的放置情况是阶梯状的. 其次,无论已经放棋子的格子上哪些是黑棋子哪些是白棋子,之前得分如何,两人在剩下的棋盘上操作,结束时棋盘的状态也就是得分仍是确定的. (记忆化不和先前的得分有关系啊,想清楚.) 也就是我们可以记忆化.由上面的分析可知,我们只需要知道每一行现在放了多少个棋子了.事实上这种状态确实不是很多. 搜索的时候是个极大极小搜索,记先手与后手的得分差,先手会最大化这个差,后手会最小化这个…
原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有棋子的,另一部分是没棋子的 那么,我们就珂以用一条轮廓线来表示有棋子的部分和没棋子的部分的分界线 我们珂以用一个二进制数表示轮廓线,长\(n+m\)位,含有\(n\)个\(1\)和\(m\)个\(0\),轮廓线从右上走到左下,二进制中一位\(1\)表示向下\(1\)格,\(0\)表示向左\(1\)格…
题目:bzoj5248 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 洛谷P4363 https://www.luogu.org/problemnew/show/P4363 终于A了(虽然得开O2才能过)! 其实就是暴搜,用一个 n+1 进制数表示状态,进行最优策略转移即可: 注意 cnt[] 如果开成全局变量就不能每次翻译那个 n+1 进制数,否则会影响其它层的搜索: (还有一种神奇的状态压缩是有几个用了 k 个1的列,就在第 k…
题目分析: 首先跑个暴力,求一下有多少种状态,发现只有18xxxx种,然后每个状态有10的转移,所以复杂度大约是200w,然后利用进制转换的技巧求一下每个状态的十进制码就行了. 代码: #include<bits/stdc++.h> using namespace std; int n,m; ][],B[][]; ][]; // after number ],arr[]; ]; int calc(){ ; ;i<=n;i++){ans += kk[i][sit[i]-];} ; } in…
题解: 水题吧 首先很显然的是状压或者搜索 考虑一下能不能状压吧 这个东西一定是长成三角形的样子的 所以是可以状压的 相邻两位之间有几个0代表他们差几 这样最多会有2n 然后就可以转移了 由于之前对博弈dp的理解非常傻逼 刚开始正着dp以为可能是一样的然后就挂了 当然是要,倒着dp才对.. 代码: #include <bits/stdc++.h> using namespace std; #define INF 1e9 <<],dp2[<<],a1[][],b1[][]…
思路 容易发现只能在轮廓线的拐点处落子,所以棋盘的状态可以用一个n+m长度的二进制数表示 转移就是10变成01 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <map> // #define int long long using namespace std; int A[20][20],B[20][20],n,m; //map<int,int> M,v…