title

BZOJ 1413
Description

在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排。游戏由两个人进行,两人轮流操作,每次操作者都可以从最左或最右的一堆中取出若干颗石子,可以将那一堆全部取掉,但不能不取,不能操作的人就输了。 Orez问:对于任意给出一个初始一个局面,是否存在先手必胜策略。

Input

文件的第一行为一个整数T,表示有 T组测试数据。对于每组测试数据,第一行为一个整数n,表示有n堆石子;第二行为n个整数ai,依次表示每堆石子的数目。

Output

对于每组测试数据仅输出一个整数0或1。其中1表示有先手必胜策略,0表示没有。

Sample Input

1
4
3 1 9 4

Sample Output

0
数据范围
对于30%的数据 n≤5 ai≤105
对于100%的数据 T≤10 n≤1000 每堆的石子数目≤109

analysis

首先我们令 :
\(L[i][j]\) 表示当前 \([i,j]\) 区间左侧放置 \(L[i,j]\) 数量的石子后先手必败;
\(R[i][j]\) 表示当前 \([i,j]\) 区间右侧放置 \(R[i,j]\) 数量的石子后先手必败。
那么最后我们只要判断 \(a[1]\) 是否等于 \(L[2,n]\) 或者 \(a[n]\) 是否等于 \(R[1,n−1]\) 即可。

唯一性
考虑证明 \(L[i][j]\) 和 \(R[i][j]\) 的唯一性,发现我们只需要证明一个成立即可。

假设 \(L[i][j]\) 存在两个,那么我们先让 \([i,j]\) 左边放上大的 \(L[i][j]\),那么它可以一步转移到另一个小的 \(L[i][j]\) ,仍旧是一个必败态,与定义矛盾,故 \(L[i][j]\) 只存在一个合法值。

转移
然后我们分类讨论...
假设当前处理到了 \(L[i][j]\) ,那么我们根据 \(L[i][j−1],R[i][j−1],a[j]\) 来处理,我们令 \(L=L[i][j−1],R=R[i][j−1],x=a[j]\)。

  • \(x=R\)
    这种情况下,我们令 \(L[i][j]=0\) ,因为 \([i,j]\) 已经是个必败态了,左边加上任意石子,先手都可以全部取完,然后后手面对必败态。
  • \(x<L,x<R\)
    这种情况下,我们令 \(L[i][j]=x\) ,这样先手不管从哪堆开始取,如果没有取完,后手只需要在另一堆取走相同数量的石子,就回到了原来的情况,
    那么如果说先手把一堆取完了,另一堆的石子数量必然是小于 \(L\) 和 \(R\) 的,相当于是先手从数量为 \(L\) 或者 \(R\) 的堆中取走了一些石子,后手必胜。
  • \(L\leq x<R\)
    这种情况下,我们令 \(L[i][j]=x+1\) ,这样先手左边取左边取,取到 \(L\) 时,后手取光右边即可;
    左边取到比 \(L\) 大的话,右边只要取走相同的石子就好了,这样可以变回同样的状态;
    取到比 \(L\) 小的话,右边取到相同的石子数为止,这样两边的石子数都小于 \(L\) 和 \(R\) ,这样就回到了状态 2 ;
    如果先手在右边取,如果取到比 \(L\) 大,我们维持状态即可,和上面一样;
    如果比 \(L\) 小,那么我们左边取到和左边相等,这样还是回到了状态 2 ;
    如果右边被先手取光了,那么我们把左边取到 \(L\) ,先手面临的就是必败态了。
  • \(R<x<L\)
    同上,我们令 \(L[i][j]=x−1\) 即可。
  • \([i,i]\) 的边界情况
    我们只需要让 \(L[i][i]=a[i]\) 即可...因为左边放上 \(a[i]\) 就是先手必败的状态,考虑此时无论先手在哪里取,后手只要在另一堆里面取相同石子即可...

最后,yyb \(Orz\)。

code

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;char buf[1<<15],*fs,*ft;
inline char getc() { return (ft==fs&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),ft==fs))?0:*fs++; }
template<typename T>inline void read(T &x)
{x=0;T f=1, ch=getchar();while (!isdigit(ch) && ch^'-') ch=getchar();if (ch=='-') f=-1, ch=getchar();while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();x*=f;
}char Out[1<<24],*fe=Out;
inline void flush() { fwrite(Out,1,fe-Out,stdout); fe=Out; }
template<typename T>inline void write(T x)
{if (!x) *fe++=48;if (x<0) *fe++='-', x=-x;T num=0, ch[20];while (x) ch[++num]=x%10+48, x/=10;while (num) *fe++=ch[num--];*fe++='\n';
}int a[maxn],l[maxn][maxn],r[maxn][maxn];
int main()
{int T;read(T);while (T--){int n;read(n);for (int i=1; i<=n; ++i) read(a[i]),l[i][i]=r[i][i]=a[i];for (int len=1; len<=n; ++len)for (int i=1; i+len<=n; ++i){int j=i+len;int L=l[i][j-1],R=r[i][j-1],z=a[j];if (R==z) l[i][j]=0;else if (L>z && R>z) l[i][j]=z;else if (L<=z && R>z) l[i][j]=z+1;else if (L>z && R<z) l[i][j]=z-1;else l[i][j]=z;L=l[i+1][j],R=r[i+1][j],z=a[i];if (R==z) r[i][j]=0;else if (L>z && R>z) r[i][j]=z;else if (L<=z && R>z) r[i][j]=z+1;else if (L>z && R<z) r[i][j]=z-1;else r[i][j]=z;}write(a[1]==l[2][n]?0:1);}flush();return 0;
}

转载于:https://www.cnblogs.com/G-hsm/p/11321869.html

BZOJ 1413: [ZJOI2009]取石子游戏 博弈+Dp相关推荐

  1. bzoj 1413: [ZJOI2009]取石子游戏(博弈+DP)

    1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 711  Solved: 470 [Submit][Sta ...

  2. poj 1067 取石子游戏(博弈+威佐夫博奕(Wythoff Game))

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29959   Accepted: 9818 Descriptio ...

  3. 小花梨的取石子游戏 ( 博弈 )

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/-萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗- ------------ ...

  4. [ZJOI2009]取石子游戏

    瞪了题解两三天,直接下转第二篇题解就康懂了 首先我们令 : \(L[i][j]\) 表示当前 \([i,j]\) 区间左侧放置 \(L[i,j]\) 数量的石子后先手必败 \(R[i][j]\) 表示 ...

  5. 威佐夫博弈:百练OJ:1067:取石子游戏

    威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...

  6. POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K              Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...

  7. 吴昊品游戏核心算法(新年特别篇)——另类取石子游戏(斐波那契博弈)

    吴昊继续,我再也不想搬一堆石头放在这里了,取而代之的是<编程之美>中的关于游戏章节的一个插图,这本书中也有对<取石子游戏>的较为完备的讨论. 这次的游戏是神马? 1堆石子有n个 ...

  8. HDU2516 取石子游戏【博弈】

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. POJ1067 HDU1527 取石子游戏【博弈】

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

最新文章

  1. java Servlet Filter 拦截Ajax请求,统一处理session超时的问题
  2. 合并分支到master_我敢打赌!这是全网最全的 Git 分支开发规范手册
  3. 设计模式--单例(Singleton)模式
  4. c++组合 聚合 关联
  5. deepin安装bochs2.6.2_深度Deepin系统中wine4.0.1源编辑安装
  6. java 房贷计算器_求一房贷计算器java源程序
  7. 熬了整整30天,字节跳动算法工程师面试
  8. python 内置浏览器robobrowser_Python RoboBrowser – 如何从此页面获取内容
  9. mapred.local.dir
  10. extjs tree下拉列表_Extjs中ComboBoxTree实现的下拉框树效果(自写)_extjs
  11. 北通usb手柄_多平台适配,北通斯巴达2无线版手柄操控灵敏
  12. android计时器和倒计时
  13. wxpython问卷调查界面_自己做的一个简单的问卷调查系统
  14. UESTC - 1057 秋实大哥与花 线段树
  15. Elliptical Grid Mapping(椭圆映射法)
  16. 智慧停车成为了改善停车环境、满足停车需求的“香饽饽”
  17. php凑整10算法,加减凑整法教案
  18. html加载m3u8
  19. 【Linux 的开胃小菜】JumpServer来袭,开源堡垒机安装及使用教程
  20. 分析器错误信息: 未能加载类型“WebApplication1.Global”。类似问题总结。

热门文章

  1. 程序员跳槽频繁不稳定被质疑,一番话后HR哑口无言!
  2. 学习笔记之MOOC《计算机程序设计C++》第5周编程作业
  3. 【微信小程序】实现简单轮播图效果
  4. 工商银行携手数美科技,赋能数字化业务高质量发展
  5. Q3营收利润双降,新作将成Take-Two逆势大爆发的动力?
  6. mysql和oceanbase区别,OceanBase基本概念
  7. office2013来了
  8. 使用webots的MPC的移动机器人轨迹跟踪控制
  9. 妹子说头像爬的太慢?升级到多线程程序爬取头像
  10. error: .repo/manifests/: contains uncommitted changes 解决办法