题面

这种搜索要把后继状态都跑出来之后取Min/Max

也就是回溯的时候进行操作

记得用hash进行记忆化(用map不开O2会TLE)

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>
#define rg register
#define max(x,y) (x)<(y)?(y):(x)
#define min(x,y) (x)>(y)?(y):(x)
using namespace std;
int n,m,A[11][11],B[11][11],ri[11];//ri[]:每行向右延伸到了多少
map<long long,int>dp;
inline int read()
{rg int save=0,w=1;rg char q=getchar();while(q<'0'||q>'9'){if(q=='-')w=-1;q=getchar();}while(q>='0'&&q<='9')save=(save<<3)+(save<<1)+q-'0',q=getchar();return save*w;
}
inline long long zip()//算出hash值
{rg long long hash=0;for(rg int i=1;i<=n;++i)hash=(hash<<3)+(hash<<1)+hash+ri[i];return hash;
}
inline void recover(rg long long hash)//把状态解析出来
{for(rg int i=n;i>=1;--i)ri[i]=hash%11,hash/=11;
}
int dfs(rg long long hash,rg bool b)//当前状态为hash,是谁下子(b==1为菲菲,b==0为牛牛)
{rg int ans=((!b)?2147483647:-2147483647),i;if(dp[hash])return ((dp[hash]==-1)?0:dp[hash]);//如果该状况已经拓展过了,把记忆化的值返回即可//且因为A数组与B数组相加减的答案可能为0,而dp[]需要记录答案,所以当答案为0时,赋给dp[]的值为-1
    recover(hash);for(i=1;i<=n;++i)//枚举在哪一行向右走
    {if(ri[i]<ri[i-1]){ri[i]++;rg int behind=dfs(zip(),!b);//回溯回来的答案为behindif(b)ans=max(ans,behind+A[i][ri[i]]);//菲菲尽量使差变大  (差:菲菲-牛牛)else ans=min(ans,behind-B[i][ri[i]]);//牛牛尽量使差变小ri[i]--;//回溯,试着走别的点
        }}if(ans==((!b)?2147483647:-2147483647))ans=0;dp[hash]=(!ans)?-1:ans;return ans;
}
int main()
{n=read(),m=read();rg int i,j;for(i=1;i<=n;++i)for(j=1;j<=m;++j)A[i][j]=read();for(i=1;i<=n;++i)for(j=1;j<=m;++j)B[i][j]=read();
//    Take me to your heart, take me to your soul, give me your hand and hold me.ri[0]=m;printf("%d\n",dfs(0,1));return 0;
}

转载于:https://www.cnblogs.com/c-wen/p/9383788.html

P4363 [九省联考2018]一双木棋相关推荐

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

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

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

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

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

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

  4. [LUOGU] P4363 [九省联考2018]一双木棋chess

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

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

    analysis 这是一道很好的状压dp 这个题首先需要分析出任何一个合法的状态都可以化为从左下角到右上角的一条对角线 这样一来状态就很好表示了: 我们考虑设f[s]表示从状态s出发,最后先手减后手的 ...

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

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

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

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

  8. BZOJ5248:[九省联考2018]一双木棋——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5248 https://www.luogu.org/problemnew/show/P4363#su ...

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

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

最新文章

  1. 观点PK | 自动驾驶传感器“一哥之争”,这事儿你怎么看?
  2. Linux学习中我的10条建议和技巧
  3. lua 函数调用1 -- 闭包详解和C调用
  4. 注册修复动态链接库DLL文件
  5. 【错误记录】Android Studio 编译信息输出乱码
  6. java多线程间的通讯
  7. SpringBoot------集成MyBatis报错
  8. C# 反射 (Reflect)
  9. day33-进程池和线程池
  10. 后端代码之服务端 - MongoDB数据库的连接、重启测试与(Studio3T)查看 - 讲解篇
  11. OSX上摆脱vagrant搭建CoreOS集群
  12. 1081 检查密码 (15 分)—PAT (Basic Level) Practice (中文)
  13. 批量更改文件名的批处理文件
  14. ACE Admin 模板实现sidebar菜单联动tabs页签
  15. ie11启用java时打不开_ie11升级后打不开怎么解决?
  16. matlab-高数 diff 二阶偏导数
  17. 管理 - SWOT分析法
  18. Ceph Async RDMA网络通信性能优化
  19. linux rsh用法,Linux中rsh远程shell命令的使用技巧解析
  20. 使用MD中控件实现APP页面折叠

热门文章

  1. JavaWeb.servlet基本使用
  2. Openlab实验平台实验--使用Postman下发流表
  3. 斗地主java_java网络斗地主
  4. 韩语在线翻译图片识别_图片怎么转表格excel
  5. 自助建站有什么优势?建站宝盒“三站合一”火爆来袭!!
  6. m4a怎么转换成mp4
  7. 韦玮:解决Ubuntu的root账号无法登录SSH问题-Permission denied, please try again.
  8. [百度空间] [转]将程序移植到64位Windows
  9. 2015年CSDN博客排名第一名,何方神圣?
  10. 物联网和大数据解决方案如何改变数字医疗行业