题意:

Alice和Bob两个好朋含友又开始玩取石子了。游戏开始时,有N堆石子排成一排,然后他们轮流操作(Alice先手),
每次操作时从下面的规则中任选一个:
1:从某堆石子中取走一个
2:合并任意两堆石子
不能操作的人输。Alice想知道,她是否能有必胜策略
T<=100, N<=50. ai<=1000

思路:From https://blog.csdn.net/sunshinezff/article/details/50893626?utm_source=blogkpcl10

   考虑如果不存在石子数为1的堆。
          设这种状态下操作数为x,显然x等于石子总数加操作数减1。
          可以证明当x为奇数时先手必胜。当x为偶数时先手必败。
          如果只有1堆石子,该结论显然成立。
          如果有多堆石子,每堆石子个数都大于1,并且x为偶数,下面我们证明这样先手必败。
          1.如果先手选择合并两堆石子,那么每堆石子的个数依然大于1,x变为奇数。
          2.如果先手选择从一堆石子数大于2的堆中拿走一枚石子,那么同上每堆石子个数依然大于1,x变为奇数。 
          3.如果先手选择从一堆石子数等于2的堆中拿走一枚石子,那么后手可以合并剩下的1枚石子到任意一个堆。
          那样x的奇偶性不变,每堆石子的个数依然大于1.
          综上所述,结论成立。
          然后考虑如果存在石子数为1的堆.我们设石子数为1的堆的个数为x,其余堆的个数为y.
          令f[x][y]为这种状态下先手必胜或是必败。
          每次转移枚举所有可能的操作。记忆化搜索即可。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
#define N 210000
#define oo 10000000
#define MOD 1000000007 int f[][]; int dfs(int a,int b)
{
if(b==) return dfs(a+,);
if(a==) return b&;
if(f[a][b]!=-) return f[a][b];
if(a&&!dfs(a-,b)) return f[a][b]=; //拿1
if(a&&b&&!dfs(a-,b+)) return f[a][b]=; //将1和大于1的合并
if(a>=&&!dfs(a-,b++(b?:))) return f[a][b]=; //合并2堆1
if(b&&!dfs(a,b-)) return f[a][b]=; //合并2堆大于1的或拿1个大于1的
return f[a][b]=;
} int main()
{
memset(f,-,sizeof(f));
int cas;
scanf("%d",&cas);
while(cas--)
{
int n;
scanf("%d",&n);
int a=;
int b=-;
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
if(x==) a++;
else b+=x+;
}
b=max(b,);
if(dfs(a,b)) printf("YES\n");
else printf("NO\n");
}
return ;
}

【BZOJ3895】取石子(博弈,记忆化搜索)的更多相关文章

  1. BZOJ 3895 3895: 取石子 / Luogu SP9934 ALICE - Alice and Bob (博弈 记忆化搜索)

    转自PoPoQQQ大佬博客 题目大意:给定n堆石子,两人轮流操作,每个人可以合并两堆石子或拿走一个石子,不能操作者输,问是否先手必胜 直接想很难搞,我们不妨来考虑一个特殊情况 假设每堆石子的数量都&g ...

  2. CodeForces 918D MADMAX(博弈+记忆化搜索)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  3. 蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索

    历届试题 地宫取宝   时间限制:1.0s   内存限制:256.0MB 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角 ...

  4. UVaLive 5760 Alice and Bob (博弈 + 记忆化搜索)

    题意:有 n 堆石子,有两种操作,一种是从一堆中拿走一个,另一种是把两堆合并起来,Alice 先拿,谁不能拿了谁输,问谁胜. 析:某些堆石子数量为 1 是特殊,石子数量大于 1 个的都合并起来,再拿, ...

  5. HDU 4111 Alice and Bob (博弈+记忆化搜索)

    题意:给定 n 堆石头,然后有两种操作,一种是把从任意一堆拿走一个,另一种是把一个石子放到另一堆上. 析:整体看,这个题真是不好做,dp[a][b] 表示有 a 堆1个石子,b个操作,操作是指把其他的 ...

  6. 【BZOJ-3895】取石子 记忆化搜索 + 博弈

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] D ...

  7. bzoj3895: 取石子(博弈论,记忆化搜索)

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 361  Solved: 177[Submit][Status][Discuss] D ...

  8. HDU 4597 Play Game (DP,记忆化搜索,博弈)

    题意:Alice和Bob玩一个游戏,有两个长度为N的正整数数字序列,每次他们两个,只能从其中一个序列,选择两端中的一个拿走.他们都希望可以拿到尽量大的数字之和, 并且他们都足够聪明,每次都选择最优策略 ...

  9. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

随机推荐

  1. Visual Studio 2017 初次体验

    在初次体验中遇到以下问题以及技巧 1. 在出现红色波浪线时为出现错误语法,将鼠标移动到相应位置可以获得相关错误信息 2.在编写代码过程中,行号上出现的小黄灯可以有提示信息 3.List 与 Array ...

  2. js数组中去重对象

    var allCourses = new Array();var coursesId = new Array();function findCourses() { Courses.data().eac ...

  3. 使用IP访问本地网站缓慢解决方法

    运行环境: win7 64位 apache2.4 php-5.6.37 最近由于业务需要,需要使用php5.6版本,所以配套升级了apache到2.4,但升级以后,发现用公司内网IP访问网站非常非常慢 ...

  4. 如何使用koa实现socket.io官网的例子

    socket.io官网中使用express实现了一个最简单的IM即时聊天,今天我们使用koa来实现一下 ### 框架准备 确保你本地已经安装好了nodejs和npm,使用koa要求node版本> ...

  5. confirm() 方法用于显示一个带有指定消息和 OK 及取消按钮的对话框。系统自带提示

    W3C地址:::::::   http://www.w3school.com.cn/jsref/met_win_confirm.asp http://www.w3school.com.cn/tiy/t ...

  6. HDU 6156 回文 数位DP(2017CCPC)

    Palindrome Function Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Ot ...

  7. Codeforces Round #461 (Div. 2) A. Cloning Toys

    A. Cloning Toys time limit per test 1 second memory limit per test 256 megabytes Problem Description ...

  8. 并查集:HDU1213-How Many Tables(并查集最简单的应用)

    How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...

  9. f触发器、存储过程

    drop trigger trig_insert--删除触发器

  10. 遗传算法 | Java版GA_TSP (2)

    嗯哼,上一篇博客中用Java实现了遗传算法求解TSP(Java版GA_TSP(我的第一个Java程序)),但明显求解效果不太好,都没太好意思贴出具体的结果,今天捣腾了下,对算法做了一些小改进,求解效果 ...