正题

P2599


题目大意

给n堆石子,第 i 堆有 aia_iai​ 个石子,每次可以从最左边或者最右边的一堆里面取若干个,两个人轮流取,问先手是否存在必胜策略


解题思路

设 li,jl_{i,j}li,j​ 为在 [i,j][i,j][i,j] 右边添加一堆大小 li,jl_{i,j}li,j​ 的石子,会使得先手必败,ri,jr_{i,j}ri,j​同理

首先证明 li,jl_{i,j}li,j​ 只存在一个

如果存在两个 li,jl_{i,j}li,j​,那么先手显然可以从大的直接操作为小的,那么先手必胜,不满足先手必败,所以最多有一个 li,jl_{i,j}li,j​

接下来证明一定存在 li,jl_{i,j}li,j​

如果不存在 li,jl_{i,j}li,j​,那么左边无论加多少个数都是必胜状态
如果先手选左边那么必定到必胜状态,不满足先手必胜,所以先手肯定选右边
选了若干数后,一定满足无论左边加的是多少都必败,那么后手在左边选一个数则又回到了必败状态,不满足先手必胜

综上,必定存在 li,jl_{i,j}li,j​

同理必定存在 ri,jr_{i,j}ri,j​ 且只存在一个

接下来考虑如何转移

对于 li,jl_{i,j}li,j​ 的求解,考虑从 [i,j−1][i,j-1][i,j−1] 转移,那么必定和 li,j−1,ri,j−1l_{i,j-1},r_{i,j-1}li,j−1​,ri,j−1​ 有关,令 L=li,j−1,R=ri,j−1L=l_{i,j-1},R=r_{i,j-1}L=li,j−1​,R=ri,j−1​

  1. R=ajR=a_jR=aj​,那么先手就是必败的,所以 li,j=0l_{i,j}=0li,j​=0
  2. 对于其他情况,其实就是把必败的决策点除外,令左右必胜决策点数相同即可
    如果先手左边拿到 L,那么右边直接取空则先手必败(右边同理)
    如果先手左边拿完,那么对于后手就是必胜得状态
    否则先手左边拿多少必胜决策,右边拿同样多即可

最后判断 a1a_1a1​ 是否等于 l2,nl_{2,n}l2,n​ 即可

时间复杂度 O(n2T)O(n^2T)O(n2T)


code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 1010
using namespace std;
int T,n,a[N],l[N][N],r[N][N];
int main()
{scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d",&a[i]);l[i][i]=r[i][i]=a[i];}for(int len=2;len<n;++len)for(int i=1;i<=n-len+1;++i){int j=i+len-1,L,R;L=l[i][j-1];R=r[i][j-1];if(a[j]==R)l[i][j]=0;else if(L<=a[j]&&a[j]<R)l[i][j]=a[j]+1;else if(a[j]<L&&a[j]<R)l[i][j]=a[j];else if(L<a[j])l[i][j]=a[j];else l[i][j]=a[j]-1;L=l[i+1][j];R=r[i+1][j];if(a[i]==L)r[i][j]=0;else if(R<=a[i]&&a[i]<L)r[i][j]=a[i]+1;else if(a[i]<R&&a[i]<L)r[i][j]=a[i];else if(R<a[i])r[i][j]=a[i];else r[i][j]=a[i]-1;}if(l[2][n]!=a[1])puts("1");else puts("0");}return 0;
}

【博弈】取石子游戏(P2599)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 1663 例题1 取石子游戏1(LOJ10241) 巴什博弈 Bash game

    总目录 在线测评地址(ybt) 在线测评地址(LOJ) 1.巴什博弈 Bash game ybt 通过 测试点 结果 内存 时间 测试点1 答案正确 600KB 2MS 测试点2 答案正确 608KB ...

  7. 博弈问题-取石子(D题小牛vs小客)附取石子游戏总结

    题目: 链接:https://www.nowcoder.net/acm/contest/75/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  8. 两人取石子游戏 组合数学-博弈问题

    取石子游戏是一个古老的博弈游戏,据说是发源于中国,它是组合数学领域的一个经典问题.它有许多不同的玩法,基本上是两个玩家,玩的形式是轮流抓石子,胜利的标准是抓走了最后的石子. 玩家设定: 先取石子的是玩 ...

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

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

  10. 取石子游戏(斐波那契博弈)

    取石子游戏 #include<iostream> #include<stdio.h> #include<string.h> #include<algorith ...

最新文章

  1. 回馈粉丝,送30本技术书。
  2. Batch request processing in backend
  3. c语言递归函数检测回文,递归法判断回文字符串,急用
  4. python微信自动回复
  5. [SSH] 设置密钥登陆
  6. 如何在不安装Microsoft Office的情况下用C#创建Excel(.XLS和.XLSX)文件?
  7. Mybatis入门——Spring整合MyBatis
  8. TcpTrace实现的基本原理
  9. Spring Boot系列(一)——初识Spring Boot
  10. cocos2d 屏幕適配_cocos2dx 3.2 屏幕适配的理解
  11. 计算机应用基础教程在线阅读,【精品】计算机应用基础教程
  12. Yii2 —— 表单美化
  13. VRay(一)材质基础
  14. 日记侠:知识付费创富没赶上,看别人赚钱你急不急?
  15. 小虎电商浏览器:鹰智客服插件怎么下载?安装麻烦吗?
  16. Satellite卫星遥感图像中小物体的分割识别
  17. ECharts 异步加载数据及loading 动画
  18. 网络传输介质 通信中的有线介质:双绞线、同轴电缆、光纤 引导性传输介质
  19. R| require()
  20. 老头怎么打边惩程咬金?

热门文章

  1. eeprom stm8l 擦除 读写_[STM8L]EEPROM操作读与写
  2. linux 短信功能,Android调用系统短信功能发送短信
  3. [MyBatisPlus]雪花算法
  4. [Nginx]location 指令说明
  5. [JS-BOM]BOM_Window窗口对象
  6. LeetCode 783二叉搜索树节点最小距离-简单
  7. [蓝桥杯2017初赛]九宫幻方-数论+next_permutation枚举
  8. 2021年广东工业大学第十五届文远知行杯程序设计竞赛(同步赛)C题 图墙+拉格朗日四平方数和定理
  9. Linear world POJ - 2674(弹性碰撞+技巧)
  10. Python--第4次平时作业