[BZOJ5248][九省联考2018]双木棋chess

bzoj
luogu

sol

首先,要保证一个格子的左边和上方都放满了棋子,就需要这个点的左上方那个矩形都放满了棋子。
这样放旗子状态就会是一个自左下至右上的轮廓线。
状态数?
跟\(yyb,ppl\)讨论了一下状态数理论上应该是\(C_{20}^{10}\)啊。
然而。。。

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[20],tot;
void dfs(int u)
{
    if (u==n+1) {++tot;return;}
    for (int i=a[u-1];i<=m;++i)
        a[u]=i,dfs(u+1);
}
int main()
{
    n=10;m=10;dfs(1);
    printf("%d\n",tot);
    return 0;
}

这里打表打的就是\(10\)个\([0,10]\)整数单调不降的方案数。
运行结果:

184756

\(???\)
状态数只有这么点?

我目前还不知道为什么。
但是既然状态数这么少就直接\(hash\)一下然后\(map\)存啊。
把既然是\([0,10]\)的整数就把它压成一个\(11\)进制的数,显然并不会爆long long。
可以直接\(dp\)。判断一下当前状态是先手还是后手进行操作,如果是先手操作就是从所有后继状态的\(dp\)值中取\(\max\),否则就是取\(\min\)。

code

#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
int gi()
{
    int x=0,w=1;char ch=getchar();
    while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if (ch=='-') w=0,ch=getchar();
    while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return w?x:-x;
}
const int N = 20;
const int inf = 2e9;
int n,m,A[N][N],B[N][N],a[N];
map<ll,int>M;
ll hash()
{
    ll res=0;
    for (int i=1;i<=n;++i) res=res*11+a[i];
    return res;
}
void unpack(ll zt)
{
    for (int i=n;i;--i) a[i]=zt%11,zt/=11;
}
int dfs(ll zt)
{
    if (M.find(zt)!=M.end()) return M[zt];
    unpack(zt);int t=0,res;
    for (int i=1;i<=n;++i) t^=a[i]&1;
    res=t?inf:-inf;
    for (int i=1;i<=n;++i)
        if (a[i-1]>a[i])
        {
            ++a[i];
            ll nxt=hash();
            if (t) res=min(res,dfs(nxt)-B[i][a[i]]);
            else res=max(res,dfs(nxt)+A[i][a[i]]);
            --a[i];
        }
    return M[zt]=res;
}
int main()
{
    n=gi();m=gi();a[0]=m;
    for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) A[i][j]=gi();
    for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) B[i][j]=gi();
    for (int i=1;i<=n;++i) a[i]=m;M[hash()]=0;
    printf("%d\n",dfs(0));return 0;
}

原文地址:https://www.cnblogs.com/zhoushuyu/p/8729273.html

时间: 2024-08-30 12:14:27

[BZOJ5248][九省联考2018]双木棋chess的相关文章

[2018九省联考]一双木棋

Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且 这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第i行中从左到右第j列的格子上的两个整数记作Aij.Bij.在 游戏结束后,菲菲和牛牛会分别计算自己的得分:菲菲的得分是所有有黑棋的格子上的Aij之和,牛牛的得分是所 有有白棋的格

【BZOJ5248】【九省联考2018】一双木棋(搜索,哈希)

[BZOJ5248][九省联考2018]一双木棋(搜索,哈希) 题面 BZOJ Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且 这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第i行中从左到右第j列的格子上的两个整数记作Aij.Bij.在 游戏结束后,菲菲和牛牛会分别计算自己

[luogu] P4364 [九省联考2018]IIIDX(贪心)

P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI 内工作,离他的梦想也越来越近了. 这款音乐游戏内一般都包含了许多歌曲,歌曲越多,玩家越不易玩腻.同时,为了使玩家在游戏上氪更多的金钱花更多的时间,游戏一开始一般都不会将所有曲目公开,有些曲目你需要通关某首特定歌曲才会解锁,而且越晚解锁的曲目难度越高. 题目描述 这一天,Konano 接到了一个任务

九省联考 2018 游记

Day0:乘火车到了上海.明天就是激动人心的比赛啦 深夜和室友看<我在七年后等你>.这真是一款不错的手游,让人印象深刻啊 Day1:迷迷糊糊到了学校.编程环境是Win7?不太习惯啊. T1:一眼状压dp题. T2:肯定可以建成一棵树,然后直接贪心?不对啊,T2不应该这么水啊(开始怀疑) T3:乍一看怎么一点思路没有啊. 8:40~11:10:持续思考T3中. 11:10:终于有思路了!如果直接NTT向上dp的话,因为链的情况复杂度会不对,所以似乎可以树剖!用线段树分治和NTT处理重链上的dp!

[九省联考 2018]一双木棋chess

Description 题库链接 给出一个 \(n\times m\) 的棋盘,棋盘的每个格子有两个权值 \(A,B\) . Alice 和 Bob 轮流操作在棋盘上放棋子,一个格子能放棋子的前提条件是这个格子的左侧和上侧均放了棋子.对于 Alice 放棋子的格子,能获得该格子的 \(A\) 的权值:对于 Bob 放棋子的格子,能获得该格子的 \(B\) 的权值. Alice 想最大化得分差, Bob 想最小化得分差,求最后得分差. \(1\leq n,m\leq 10\) Solution 比

P4363 [九省联考2018]一双木棋

题面 这种搜索要把后继状态都跑出来之后取Min/Max 也就是回溯的时候进行操作 记得用hash进行记忆化(用map不开O2会TLE) #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<map> #define rg register #de

P4363 [九省联考2018]一双木棋chess(对抗搜索+记忆化搜索)

传送门 这对抗搜索是个啥玩意儿…… 首先可以发现每一行的棋子数都不小于下一行,且局面可由每一行的棋子数唯一表示,那么用一个m+1进制数来表示当前局面,用longlong存,开map记忆化搜索 然后时间复杂度的问题,rqy这样说的 然后这个对抗搜索的话……个人理解就是因为要最大化分值的差,所以在一个人下棋的时候令他得分最大,另一个人得分最小 1 //minamoto 2 #include<cstdio> 3 #include<iostream> 4 #include<map&g

p4363 [九省联考2018]一双木棋chess

传送门 分析 我们用0表示向右,1表示向上 于是可以得到一条江棋盘分为两块的线 直接dp即可 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<cti

[BZOJ5251][九省联考2018]劈配(网络流)

5251: [2018多省省队联测]劈配 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 33  Solved: 22[Submit][Status][Discuss] Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 题目描述 轻车熟路的Zayid顺利地通过了海选,接下来的环节是导师盲选,这一阶段的规则是这样的: 总共n名参赛选手(编号