【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子
Time Limit: 1 Sec Memory Limit: 512 MB
Submit: 263 Solved: 127
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
3
1 1 2
2
3 4
3
2 3 5
Sample Output
NO
NO
HINT
Source
Solution
结论+记忆化搜索
首先,手玩或者感受一下,很好发现:操作总数S=$\sum a_{i}+N-1.......(x>1)$
这样进一步发现,如果S为奇数,显然先手必胜
证明:
难以证明S为奇数先手必胜,考虑证明S为偶数先手必败;
首先如果只有一堆,为奇数,显然先手必胜;
1.如果先手选择合并两堆石子,那么每堆石子的个数依然大于1,x变为奇数.
2.如果先手选择从一堆石子数大于2的堆中拿走一枚石子,那么同上每堆石子个数依然大于1,x变为奇数。
3.如果先手选择从一堆石子数等于2的堆中拿走一枚石子,那么后手可以合并剩下的1枚石子到任意一个堆。那样x的奇偶性不变,每堆石子的个数依然大于
所以这样可以得到对于所有x>1的情况,那么考虑存在x=1的情况
可以分为4种情况考虑:
1.取走某个大小为1的堆中的石子.
2.将某个大小为1的堆和某个大小不为1的堆合并
3.合并两个大小为1的堆.
4.对大小不为1的堆进行合并或者取石子操作.
那么我们用OK[i][j]表示状态,表示仅有1颗石子的有i堆,多颗石子堆的总操作数为S
那么对于上述情况,显然可以利用记忆化搜索转移
考虑数据最大值并不大,所以可以通过所有数据。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read()
{
int w=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') w=w*+ch-'',ch=getchar();
return w;
}
#define MAXN 100
#define int register int
bool ok[][],visit[][];
inline bool DFS(int x,int y)
{
if (!x) return y&;
if (y==) return DFS(x+,);
if (visit[x][y]) return ok[x][y];
visit[x][y]=;
if (x>= && y && !DFS(x-,y+)) {ok[x][y]=; return ;}
if (x>= && !y && !DFS(x-,y+)) {ok[x][y]=; return ;}
if (x && y && !DFS(x-,y+)) {ok[x][y]=; return ;}
if (y && !DFS(x,y-)) {ok[x][y]=; return ;}
if (x && !DFS(x-,y)) {ok[x][y]=; return ;}
ok[x][y]=;
return ;
}
main()
{
int N,a[MAXN],T,sum;
T=read();
while (T--)
{
N=read();
bool flag=;
sum=;
for (int i=; i<=N; i++)
{
a[i]=read(),sum+=a[i];
if (a[i]==) flag=;
}
if (flag)
if ((sum+N-)&) puts("YES"); else puts("NO");
else
{
int x=,y=;
for (int i=; i<=N; i++)
if (a[i]==) x+=a[i]; else y+=a[i]+;
if (DFS(x,max(y-,))) puts("YES"); else puts("NO");
}
}
// return 0;
}
Sunshine学长的Day3T2....
测试的时候,手玩了好几组,发现了结论,于是随口和DCrusher大爷一说
被DCrusher大爷一顿教育
大爷教育我说,随便一个记搜就出来了,然后滚去用10分钟写了个记搜..
手残写错了一个地方,卡成了80.....BeiYu大爷标算卡成50...
DCrusher实力虐场Orz
【BZOJ-3895】取石子 记忆化搜索 + 博弈的更多相关文章
- BZOJ 3895: 取石子[SG函数 搜索]
有N堆石子 ·从某堆石子中取走一个 ·合并任意两堆石子 不能操作的人输. 100%的数据满足T<=100, N<=50. ai<=1000 容易发现基础操作数$d=\sum a ...
- HDU 4597 Play Game (记忆化搜索博弈DP)
题意 给出2*n个数,分两列放置,每列n个,现在alice和bob两个人依次从任意一列的对头或队尾哪一个数,alice先拿,且两个人都想拿最多,问alice最后能拿到数字总和的最大值是多少. 思路 4 ...
- BZOJ.1024.[SCOI2009]生日快乐(记忆化搜索)
题目链接 搜索,枚举切的n-1刀. 对于长n宽m要切x刀,可以划分为若干个 长n'宽m'要切x'刀 的子问题,对所有子问题的答案取max 对所有子问题的方案取min 就是当前状态答案. 这显然是会有很 ...
- bzoj 3895 取石子 —— 博弈论
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3895 看了博客:https://blog.csdn.net/popoqqq/article/ ...
- bzoj 3895: 取石子
$ \color{#0066ff}{ 题目描述 }$ Alice和Bob两个好朋含友又开始玩取石子了.游戏开始时,有N堆石子 排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选 ...
- bzoj 3895 取石子——博弈论
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3895 看题解:https://blog.csdn.net/popoqqq/article/d ...
- bzoj 1415 期望dp + 记忆化搜索
思路:这个题看着感觉不能dp,其实是可以dp的,因为狼每次走两步,兔子每次走一步,每进行一轮以后,狼和兔子的距离 肯定是在接近的,没有相同的状态,dp之前预处理出来,每一步狼该往哪里走. #inclu ...
- HDU 4597 记忆化搜索
² 博弈取牌—记忆化搜索 题目描述: 有两副带有数字的牌,(数字>0)两人轮流取,取中了某张牌,自己的分数就加上牌上的数字,但只能从两端取,每人都会用最优的策略使得自己的分数最高.问A先取,他能 ...
- UVALive 6470 Chomp --记忆化搜索
题意:给一个只有三行的方块阵(横向最多100个),然后p,q,r分别代表第1,2,3层的方格数,两人轮流去掉一个格子,此时这个格子的右上方都会被去掉,面临只剩最左下角的一个格子的状态的人输,问先手能否 ...
随机推荐
- [NOIP2010初赛]烽火传递+单调队列详细整理
P1313 [NOIP2010初赛]烽火传递 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上 ...
- HTTP下密码的安全传输、OAuth认证
在复杂的web环境下,我们没有百分的把握保证信息在传输的过程中不被接货,那不是用明文如何告诉服务器自己的身份呢? 在一些高度通信安全的网络中,数据传输会使用HTTPS作为传输协议,但是通常情况下我们没 ...
- Shell脚本语法
索引 1. 第一行必须是"#!/bin/sh" 2. 注释:一行开头为 # 3. 定义变量 4. 逻辑符号 5. 接收参数 6. 控制流:if/then/elif/else/f ...
- 金旭亮老师的Scoekt编程摘要
Socket提供了众多的属性,还提供了SetSocketOption方法来设置各种选项,对.NET网络应用程序的数据通讯进行“微调”. Socket的功能出奇地强大,在.NET平台上,它支持以下 ...
- Java多线程总结(二)锁、线程池
掌握Java中的多线程,必须掌握Java中的各种锁,以及了解Java中线程池的运用.关于Java多线程基础总结可以参考我的这篇博文Java多线程总结(一)多线程基础 转载请注明出处——http://w ...
- string to char* and char* to string 玩转 String 和 Char*
char 类型是c语言中常见的一个数据类型,string是c++中的一个,它的定义为 Strings are objects that represent sequences of character ...
- jQuery 之 Callback 实现
在 js 开发中,由于没有多线程,经常会遇到回调这个概念,比如说,在 ready 函数中注册回调函数,注册元素的事件处理等等.在比较复杂的场景下,当一个事件发生的时候,可能需要同时执行多个回调方法,可 ...
- Social Emotional Computing -情感模式与价值变化
情感模式与价值变化 第七节 情感模式与价值变化 情感与价值的关系是主观与客观的关系,人的情感不管多么飘忽不定,都可以找到它的价值对应物,情感的任何变化都可以从价值关系的变动中找到它的客观动因,情感的不 ...
- 【原创】解决jquery在ie中不能解析字符串类型xml结构的xml字符串的问题
$.fn.extend({ //此方法解决了ie中jquery不识别非xml的类型的xml字符串的问题 tony tan findX: function (name) { if (this & ...
- 关于#pragma once和#ifndefine组合的区别
最近在看duilib代码,发现头文件既有#pragma once 又有 #ifndefine...#define,忽然就觉得有点不解,因为据我所知这两者都是防止头文件二次包含的. 经过下面两位的解释后 ...