思路

容易发现只能在轮廓线的拐点处落子,所以棋盘的状态可以用一个n+m长度的二进制数表示

转移就是10变成01

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <map>
  5. // #define int long long
  6. using namespace std;
  7. int A[20][20],B[20][20],n,m;
  8. //map<int,int> M,vis;
  9. int M[(1<<21)],vis[(1<<21)];
  10. void print(int x){
  11. for(int i=n+m-1;i>=0;i--)
  12. printf("%d",(x>>i)&1);
  13. putchar('\n');
  14. }
  15. int dfs(int state,int which){//0 feifei 1 niuniu
  16. // print(state);
  17. // printf("which:%d\n",which);
  18. // getchar();
  19. if(vis[state]){
  20. // printf("req=%d\n",M[state]);
  21. return M[state];
  22. }
  23. vis[state]=true;
  24. int x=m,y=0;
  25. int mid;
  26. if(!which)
  27. mid=-0x3f3f3f3f3f3f3f3fLL;
  28. else
  29. mid=0x3f3f3f3f3f3f3f3fLL;
  30. for(int i=0;i<n+m;i++){
  31. if((i+1)<n+m&&((state>>i)&1)==0&&((state>>(i+1))&1)==1){
  32. // printf("y=%d x=%d\n",y+1,x);
  33. int to=state^(3<<i);
  34. if(!which)
  35. mid=max(mid,dfs(to,which^1)+A[y+1][x]);
  36. else
  37. mid=min(mid,dfs(to,which^1)-B[y+1][x]);
  38. // printf("mid=%d\n",mid);
  39. }
  40. if((state>>i)&1)
  41. y++;
  42. else
  43. x--;
  44. }
  45. M[state]=mid;
  46. // printf("req=%d\n",M[state]);
  47. return mid;
  48. }
  49. signed main(){
  50. // freopen("test.in","r",stdin);
  51. scanf("%d %d",&n,&m);
  52. // int t=clock();
  53. int st=(((1<<(n))-1)<<m),end=(1<<n)-1;
  54. // print(st);
  55. // print(end);
  56. vis[end]=true;
  57. M[end]=0;
  58. for(int i=1;i<=n;i++){
  59. for(int j=1;j<=m;j++){
  60. scanf("%d",&A[i][j]);
  61. }
  62. }
  63. for(int i=1;i<=n;i++){
  64. for(int j=1;j<=m;j++){
  65. scanf("%d",&B[i][j]);
  66. }
  67. }
  68. printf("%d\n",dfs(st,0));
  69. // printf("time=%lf\n",1.0*(clock()-t)/CLOCKS_PER_SEC);
  70. return 0;
  71. }

P4363 [九省联考2018]一双木棋chess的更多相关文章

  1. 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告

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

  2. 洛谷 P4363 [九省联考2018]一双木棋chess 题解

    题目链接:https://www.luogu.org/problemnew/show/P4363 分析: 首先博弈,然后考虑棋盘的规则,因为一个子在落下时它的上面和左面都已经没有空位了,所以棋子的右下 ...

  3. luogu P4363 [九省联考2018]一双木棋chess

    传送门 对抗搜索都不会,我真是菜死了qwq 首先根据题目条件,可以发现从上到下每一行的棋子数是单调不增的,然后n m都比较小,如果把状态搜出来,可以发现合法状态并不多,所以可以用一个11进制数表示状态 ...

  4. 【题解】Luogu P4363 [九省联考2018]一双木棋chess

    原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有 ...

  5. 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】

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

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

    传送门 这对抗搜索是个啥玩意儿…… 首先可以发现每一行的棋子数都不小于下一行,且局面可由每一行的棋子数唯一表示,那么用一个m+1进制数来表示当前局面,用longlong存,开map记忆化搜索 然后时间 ...

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

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

  8. BZOJ.5248.[九省联考2018]一双木棋chess(对抗搜索 记忆化)

    BZOJ 洛谷P4363 [Update] 19.2.9 重做了遍,感觉之前写的有点扯= = 首先棋子的放置情况是阶梯状的. 其次,无论已经放棋子的格子上哪些是黑棋子哪些是白棋子,之前得分如何,两人在 ...

  9. [九省联考2018]一双木棋chess——搜索+哈希

    题目:bzoj5248 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 洛谷P4363 https://www.luogu.org/prob ...

随机推荐

  1. zookeeper日志清理

    环境 Red Hat Enterprise Linux Server release 7.3 (Maipo) jdk1.7.0_80      zookeeper-3.4.11 一.事务日志和快照日志 ...

  2. CachedIntrospectionResults 初始化

  3. 如何用新安装的jdk替换掉Linux系统默认jdk

    版主写的非常棒: http://blog.csdn.net/u011364306/article/details/48375653

  4. hive 将一个分区表数据全部插入另外一个分区表

    假如现在hive有个分区表A,分区字段为dt 需求是:需要将A表中的数据全部插入到分区表B中 具体步骤如下: 1.create B like A: 2.插入数据 set hive.exec.dynam ...

  5. tensorflow学习5----GAN模型初探

    生成模型: 通过观测学习样本和标签的联合概率分布P(X,Y)进行训练,训练好的模型能够生成符合样本分布的新数据,在无监督学习方面,生成式模型能够捕获数据的高阶相关性,通过学习真实数据的本质特征,刻画样 ...

  6. formdata 和 Payload 区别

    FormData和Payload是浏览器传输给接口的两种格式,这两种方式浏览器是通过Content-Type来进行区分的(了解Content-Type),如果是 application/x-www-f ...

  7. RBAC

    什么是rbac? -- 基于角色的权限控制  Role-Based Access Control 一个url就代表一个权限 // url分配给角色,角色分配给用户 -- 6个model,4张表 菜单表 ...

  8. vue:vuex详解

    一.什么是Vuex? https://vuex.vuejs.org/zh-cn 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相 ...

  9. python之字符串函数

    1.  endswith()  startswith() # 以什么什么结尾 # 以什么什么开始 test = "alex" v = test.endswith('ex') v = ...

  10. LoggerFactory.getLogger用法

    使用指定类初始化日志对象,在日志输出的时候,可以打印出日志信息所在类 如:Logger logger = LoggerFactory.getLogger(com.lz.Test.class);     ...