【博弈】取石子游戏(P2599)
正题
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
- R=ajR=a_jR=aj,那么先手就是必败的,所以 li,j=0l_{i,j}=0li,j=0
- 对于其他情况,其实就是把必败的决策点除外,令左右必胜决策点数相同即可
如果先手左边拿到 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)相关推荐
- 威佐夫博弈:百练OJ:1067:取石子游戏
威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...
- POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...
- 吴昊品游戏核心算法(新年特别篇)——另类取石子游戏(斐波那契博弈)
吴昊继续,我再也不想搬一堆石头放在这里了,取而代之的是<编程之美>中的关于游戏章节的一个插图,这本书中也有对<取石子游戏>的较为完备的讨论. 这次的游戏是神马? 1堆石子有n个 ...
- HDU2516 取石子游戏【博弈】
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- POJ1067 HDU1527 取石子游戏【博弈】
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 1663 例题1 取石子游戏1(LOJ10241) 巴什博弈 Bash game
总目录 在线测评地址(ybt) 在线测评地址(LOJ) 1.巴什博弈 Bash game ybt 通过 测试点 结果 内存 时间 测试点1 答案正确 600KB 2MS 测试点2 答案正确 608KB ...
- 博弈问题-取石子(D题小牛vs小客)附取石子游戏总结
题目: 链接:https://www.nowcoder.net/acm/contest/75/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- 两人取石子游戏 组合数学-博弈问题
取石子游戏是一个古老的博弈游戏,据说是发源于中国,它是组合数学领域的一个经典问题.它有许多不同的玩法,基本上是两个玩家,玩的形式是轮流抓石子,胜利的标准是抓走了最后的石子. 玩家设定: 先取石子的是玩 ...
- poj 1067 取石子游戏(博弈+威佐夫博奕(Wythoff Game))
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29959 Accepted: 9818 Descriptio ...
- 取石子游戏(斐波那契博弈)
取石子游戏 #include<iostream> #include<stdio.h> #include<string.h> #include<algorith ...
最新文章
- 回馈粉丝,送30本技术书。
- Batch request processing in backend
- c语言递归函数检测回文,递归法判断回文字符串,急用
- python微信自动回复
- [SSH] 设置密钥登陆
- 如何在不安装Microsoft Office的情况下用C#创建Excel(.XLS和.XLSX)文件?
- Mybatis入门——Spring整合MyBatis
- TcpTrace实现的基本原理
- Spring Boot系列(一)——初识Spring Boot
- cocos2d 屏幕適配_cocos2dx 3.2 屏幕适配的理解
- 计算机应用基础教程在线阅读,【精品】计算机应用基础教程
- Yii2 —— 表单美化
- VRay(一)材质基础
- 日记侠:知识付费创富没赶上,看别人赚钱你急不急?
- 小虎电商浏览器:鹰智客服插件怎么下载?安装麻烦吗?
- Satellite卫星遥感图像中小物体的分割识别
- ECharts 异步加载数据及loading 动画
- 网络传输介质 通信中的有线介质:双绞线、同轴电缆、光纤 引导性传输介质
- R| require()
- 老头怎么打边惩程咬金?
热门文章
- eeprom stm8l 擦除 读写_[STM8L]EEPROM操作读与写
- linux 短信功能,Android调用系统短信功能发送短信
- [MyBatisPlus]雪花算法
- [Nginx]location 指令说明
- [JS-BOM]BOM_Window窗口对象
- LeetCode 783二叉搜索树节点最小距离-简单
- [蓝桥杯2017初赛]九宫幻方-数论+next_permutation枚举
- 2021年广东工业大学第十五届文远知行杯程序设计竞赛(同步赛)C题 图墙+拉格朗日四平方数和定理
- Linear world POJ - 2674(弹性碰撞+技巧)
- Python--第4次平时作业