Description

菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。
棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结
束。落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧
及上方的所有格子内都有棋子。
棋盘的每个格子上,都写有两个非负整数,从上到下第i 行中从左到右第j 列的格
子上的两个整数记作Ai j 、Bi j 。在游戏结束后,菲菲和牛牛会分别计算自己的得分:菲
菲的得分是所有有黑棋的格子上的Ai j 之和,牛牛的得分是所有有白棋的格子上的Bi j
的和。
菲菲和牛牛都希望,自己的得分减去对方的得分得到的结果最大。现在他们想知
道,在给定的棋盘上,如果双方都采用最优策略且知道对方会采用最优策略,那么,最
终的结果如何。

Input

从文件chess.in 中读入数据。
输入第一行包含两个正整数n;m,保证n;m <=10。
接下来n 行,每行m 个非负整数,按从上到下从左到右的顺序描述每个格子上的
第一个非负整数:其中第i 行中第j 个数表示Ai j。
接下来n 行,每行m 个非负整数,按从上到下从左到右的顺序描述每个格子上的
第二个非负整数:其中第i 行中第j 个数表示Bi j。

Output

输出到文件chess.out 中。
输出一个整数,表示菲菲的得分减去牛牛的得分的结果。

Sample Input

【样例1 输入】
2 3
2 7 3
9 1 2
3 7 2
2 3 1

Sample Output

【样例1 输出】
2

Data Constraint

Hint


棋盘如图所示,双方都采用最优策略时,棋局如下:
• 菲菲下在第1 行第1 列(这是第一步时唯一可以落子的格子);
• 牛牛下在第1 行第2 列;
• 菲菲下在第2 行第1 列;
• 牛牛下在第1 行第3 列;
• 菲菲下在第2 行第2 列;
• 牛牛下在第2 行第3 列(这是这一步时唯一可以落子的格子);
• 填满棋盘,游戏结束,盘面如下。

菲菲的得分为:2 + 9 + 1 = 12 ;牛牛的得分为:7 + 2 + 1 = 10 。

Solution

  • 首先,我们发现下棋的地方形如:
    ####-
    ###–
    ##—
    ##—
    #—-

  • 即盘踞在左上角的一整块。

  • 于是考虑记忆化搜索+Hash,状态就是每一行填了几个棋子,用Hash压起来(11进制)。

  • 之后判断此时改哪一方走,若是先手一方走,则:

    ans=max(ans,dfs(s)+a[i][j])

    ans=max(ans,dfs(s)+a[i][j])

  • 若是后手方,则:

    ans=min(ans,dfs(s)−b[i][j])

    ans=min(ans,dfs(s)-b[i][j])

  • 注意能转移时下一行的棋子数要大于上一行的棋子数。

  • 有用状态只有 C1020C_{20}^{10} 种。

Code

#include<cstdio>
#include<map>
#include<cctype>
using namespace std;
typedef long long LL;
const int N=11,inf=1e9;
int n,m;
int a[N][N],b[N][N];
map<LL,int>mp;
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline int max(int x,int y)
{return x>y?x:y;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline void init()
{n=read(),m=read();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) a[i][j]=read();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) b[i][j]=read();LL all=0;for(int i=1;i<=n;i++) all=all*N+m;mp[all]=0;
}
inline LL hash(int *f)
{LL sum=0;for(int i=1;i<=n;i++) sum=sum*N+f[i];return sum;
}
int dfs(LL s)
{if(mp.count(s)) return mp[s];int f[N];f[0]=m;LL x=s;int pd=0,ans;for(int i=n;i;i--) pd+=f[i]=x%N,x/=N;if(pd&1){ans=inf;for(int i=1;i<=n;i++)if(f[i]<f[i-1]){f[i]++;ans=min(ans,dfs(hash(f))-b[i][f[i]]);f[i]--;}}else{ans=-inf;for(int i=1;i<=n;i++)if(f[i]<f[i-1]){f[i]++;ans=max(ans,dfs(hash(f))+a[i][f[i]]);f[i]--;}}return mp[s]=ans;
}
int main()
{init();printf("%d",dfs(0));return 0;
}

JZOJ 5637. 【NOI2018模拟4.8】一双木棋相关推荐

  1. 「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess

    「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess 学校省选模拟居然拿九省联考来考 然而我还是\(too\space young\),搞不懂什么叫最优 让二者的答案最接近可 ...

  2. 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess

    洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...

  3. bzoj5248 [2018多省省队联测]一双木棋

    5248: [2018多省省队联测]一双木棋 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 155  Solved: 132 [Submit][St ...

  4. 「九省联考 2018」一双木棋

    「九省联考 2018」一双木棋 题目描述 菲菲和牛牛在一块 \(n\) 行 \(m\) 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满 ...

  5. JZOJ 5637 一双木棋

    传送门 考场上的思路 正解 参考代码 总结 传送门 考场上的思路   什么叫做最优策略???我暴力都打不来怎么办???好像 n,m=2n,m=2n, m = 2 可以直接得出答案,m=1m=1m = ...

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

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

  7. bzoj 5248: [2018多省省队联测]一双木棋

    Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ...

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

    题目传送门 题目描述 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以 ...

  9. bzoj5248(洛谷4363)(2018九省联考)一双木棋

    题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...

最新文章

  1. java删除本地文件_读取Properties文件六种方法
  2. 【python】使用plt.imshow(image)显示图片一片空白,像素值有数据
  3. Spark Streaming的窗口操作
  4. 月蚀动漫获快看漫画600万元A轮战略投资,走国漫精品化路线
  5. jQuery插件-轻量图片轮换-UISlide2
  6. 常见设计模式 (python代码实现)
  7. hibernate mysql cascade_Hibernate第五篇【inverse、cascade属性详解】
  8. 每个时代都有每个时代的风口
  9. IDEA 如何打jar包
  10. MvcPager使用的Demo(同步分页)
  11. 笑死,小米新logo是这么来的
  12. 在MATLAB中的图例标注及实例说明
  13. android+自定义跑马灯,Android自定义图文跑马灯效果
  14. CTS测试中testYuvBurst[1]项
  15. 顾客价值理论(转载)
  16. MongoDB学习总结四(详细记录使用MongoTemplate操作MongoDB数据库)
  17. 宝德服务器——企业需要真正的按需定制产品
  18. SpringCloud微服务之间使用Feign调用不通情况举例
  19. linux firmware 框架,学习整理:arm-trusted-firmware
  20. XMind (2021)新增演说模式

热门文章

  1. EXCEL利用VBA自由控制图表绘图区大小
  2. python的setup.py文件及其常用命令
  3. 【Python】一道题吃够Python语法糖
  4. USTC English Club Note20171015
  5. 十五、“一路风光无限好,鸣嘤处处贺新婚。”(2021.5.3)
  6. 第10课:优化神经网络——如何防止过拟合
  7. python 日志不会按照日期分割_python日志切割保留一个月
  8. VTK修炼之道37:图像平滑_高斯滤波器
  9. WINDOWS系统常用程序及快捷键
  10. 在代码中使用SqlCommand对象