Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 439  Solved: 379
[Submit][Status][Discuss]

Description

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

Input

第一行包含两个正整数n,m,保证n,m≤10。
接下来n行,每行m个非负整数,按从上到下从左到右的顺序描述每个格子上的
第一个非负整数:其中第i行中第j个数表示Aij。
接下来n行,每行m个非负整数,按从上到下从左到右的顺序描述每个格子上的
第二个非负整数:其中第i行中第j个数表示Bij
n, m ≤ 10 , Aij, Bij ≤ 100000
 

Output

输出一个整数,表示菲菲的得分减去牛牛的得分的结果。
 

Sample Input

2 3
2 7 3
9 1 2
3 7 2
2 3 1

Sample Output

2

HINT

Source

用$now[i]$表示第$i$行已经放了$now[i]$个棋子

爆搜之后发现状态数很小

因此用map记忆化一下就好

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<map>
  5. #include<ext/pb_ds/assoc_container.hpp>
  6. #include<ext/pb_ds/hash_policy.hpp>
  7. #define LL long long
  8. using namespace std;
  9. using namespace __gnu_pbds;
  10. const int MAXN = , INF = 1e9 + , base = ;
  11. inline int read() {
  12. char c = getchar(); int x = , f = ;
  13. while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
  14. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  15. return x * f;
  16. }
  17. int N, M;
  18. int A[MAXN][MAXN], B[MAXN][MAXN];
  19. cc_hash_table<LL, int>mp;
  20. int now[MAXN];
  21. LL gethash() {
  22. LL x = ;
  23. for(int i = ; i <= N; i++) x = x * base + now[i];
  24. return x;
  25. }
  26. void push(LL x) {
  27. for(int i = N; i >= ; i--) now[i] = x % base, x /= base;
  28. }
  29. int getnext() {
  30. int x = ;
  31. for(int i = ; i <= N; i++) x += now[i];
  32. return x & ;
  33. }
  34. int dfs(LL sta) {
  35. if(mp.find(sta) != mp.end()) return mp[sta];
  36. push(sta);
  37. bool type = getnext();
  38. int ans = !type ? -INF : INF;
  39. for(int i = ; i <= N; i++) {
  40. if(now[i] < now[i - ]) {
  41. now[i]++;
  42. LL nxt = gethash();
  43. int val = dfs(nxt);
  44. ans = !type ? max(ans, val + A[i][now[i]]) : min(ans, val - B[i][now[i]]);
  45. now[i]--;
  46. }
  47. }
  48. return mp[sta] = ans;
  49. }
  50. main() {
  51. #ifdef WIN32
  52. freopen("a.in", "r", stdin);
  53. //freopen("a.out", "w", stdout);
  54. #else
  55. freopen("chess2018.in", "r", stdin);
  56. freopen("chess2018.out", "w", stdout);
  57. #endif
  58. N = read(); M = read();
  59. for(int i = ; i <= N; i++)
  60. for(int j = ; j <= M; j++)
  61. A[i][j] = read();
  62. for(int i = ; i <= N; i++)
  63. for(int j = ; j <= M; j++)
  64. B[i][j] = read();
  65. for(int i = ; i <= N; i++) now[i] = M;
  66. mp[gethash()] = ;
  67. dfs();
  68. printf("%d", mp[]);
  69. }

BZOJ 5248: [2018多省省队联测]一双木棋(对抗搜索)的更多相关文章

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

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

  2. 【刷题】BZOJ 5248 [2018多省省队联测]一双木棋

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

  3. bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋

    https://www.lydsy.com/JudgeOnline/problem.php?id=5248 先手希望先手得分减后手得分最大,后手希望先手得分减后手得分最小 棋盘的局面一定是阶梯状,且从 ...

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

    直接hash+爆搜即可. #include <cstdio> #include <cstring> #include <iostream> #include < ...

  5. B5248 [2018多省省队联测]一双木棋 状压dp

    这个题当时划水,得了二十分,现在来整一整. 这个题用状压来压缩边界线,然后通过记忆化搜索进行dp.我们可以观察到,其实每次转移,就是把一个1向左移一位.最后的状态设为0. 这其中还要有一个变量来记录谁 ...

  6. bzoj 5249 [2018多省省队联测] IIIDX

    bzoj 5249 [2018多省省队联测] IIIDX Link Solution 首先想到贪心,直接按照从大到小的顺序在后序遍历上一个个填 但是这样会有大问题,就是有相同的数的时候,会使答案不优 ...

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

    [BZOJ5248][九省联考2018]一双木棋(搜索,哈希) 题面 BZOJ Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何 ...

  8. bzoj 5251: [2018多省省队联测]劈配

    Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 题目描述 轻车熟路的Zayi ...

  9. BZOJ 5249: [2018多省省队联测]IIIDX(贪心 + 线段树)

    题意 这一天,\(\mathrm{Konano}\) 接到了一个任务,他需要给正在制作中的游戏 \(\mathrm{<IIIDX>}\) 安排曲目 的解锁顺序.游戏内共有\(n\) 首曲目 ...

随机推荐

  1. SSH反向代理转发至内网msf

    前言 买了个便宜的 vps , 在上面装 msf 也装不上,于是想着把端口映射到内网来. 正文 拓扑如下: 首先在内网主机 B ssh -fCNR 7281:localhost:5000 root@C ...

  2. SVN的正确提交方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Rundy_Deng/article/details/80338093 也会让我们百思不得其解,甚至耽 ...

  3. 如何使用chrome devtool调试Mobile网页?

    凡是做过mobile网页web app开发的朋友一定对开发效率的底下会有吐槽.现在chrome dev tool改变了程序员们的苦比. 0.登录google chrome 1. chrome://in ...

  4. HTML5离线存储之webstorage

    html5在引入webStorage之前,主要用cookies. html5的webstorage 分两种:LocalStorage 和SessionStorage,两者的差别主要在生命周期不同. 1 ...

  5. rabbitmq集群配置

    原文地址:http://www.360doc.com/content/14/0911/17/15077656_408713893.shtml 按照文章中的方式成功建立了两台机器的集群. 但文章中加入集 ...

  6. sql大数据多条件查询索引优化

    此优化的前提可以称之为最近流行的头条人物“许三多”,总数据多,查询条件多,返回列多 优化前分页查询内部select列为需要的全部列,优化后内部select只返回ID主键,外部查询关联原数据表,然后查出 ...

  7. git 和github

    ssh git:    是一个版本管理工具,是可以在你电脑不联网的情况下,只在本地使用的一个版本管理工具,其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,以后虽然修改了,但是通过git这 ...

  8. RCLighting

    RCLighting https://github.com/RidgeCorn/RCLighting 效果: 真机测试的效率: 看了源码,其实原理很简单: ====================== ...

  9. Java学习---MD5加密算法

    前言 在我们日常的程序开发中,或多或少会遇到一些加密/解密的场景,比如在一些接口调用的过程中,我们(Client)不仅仅需要传递给接口服务(Server)必要的业务参数,还得提供Signature(数 ...

  10. Burp Suite使用介绍总结

    Burp Suite使用介绍(一) 小乐天 · 2014/05/01 19:54 Getting Started Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些 ...