poj2068--Nim

题意:给你2n个人,两方各n个人,交叉坐,每个人可以取的石子有一个最大限制,总共有S颗石子,哪一方取了最后一颗石子就输了,问先取石子的这一方是否有必胜策略。

DP,dp[i][j]代表第i个人还有J个石子没有取得状态。记忆化搜索

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 int dp[22][9005],s,n,a[9005];
 8 int dfs(int x,int f){
 9     if (dp[x][f]!=-1) return dp[x][f];
10     for (int i=1;i<=a[x];i++){
11         int t=f-i,y;
12         if (t<0) break;
13         if (x+1>=2*n) y=0;else y=x+1;
14         if (dfs(y,t)==0) return dp[x][f]=1;
15     }
16     return dp[x][f]=0;
17 }
18 int main(){
19     while (scanf("%d",&n)&&n){
20         scanf("%d",&s);
21         for (int i=0;i<2*n;i++)
22          scanf("%d",&a[i]);
23         memset(dp,-1,sizeof dp);
24         for (int i=0;i<2*n;i++) dp[i][0]=1;
25         int ans=dfs(0,s);
26         if (ans) printf("1\n");
27         else printf("0\n");
28     }
29 }
时间: 2024-12-20 18:43:49

poj2068--Nim的相关文章

[POJ2068]Nim解题报告

Let's play a traditional game Nim. You and I are seated across a table and we have a hundred stones on the table (we know the number of stones exactly). We play in turn and at each turn, you or I can remove on to four stones from the heap. You play f

博弈论类题目小结——转载

出处http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_cxlove/article/details/7854534 经典的删边游戏小结:http://blog.csdn.net/acm

【poj2068】Nim

Portal -->poj2068 Description ? ?给你\(S\)个石子,有\(2n\)个人分成两队,编号为奇数的一队,编号为偶数的一队,\(2n\)个人按照编号从小到大的顺序拿石子,所有人都拿过了就再从\(1\)号轮,编号为\(i\)的人一次可以拿\(x\in[1,a[i]]\)颗,拿到最后一颗石子的队伍输,判断当前局面是否先手必胜 Solution ? ?emmm今天做了几道sg函数的题然后感觉这玩意很神秘 ?? ?除了转化成"有向图游戏"那样的形式之后用异或和

【POJ2068】Nim DP博弈

题意: 多组数据 两人轮流操作,n轮一循环,给出总石子数和这n轮每次两人能取的石子上限(下限为1). 取到最后一颗者输. 比如 3 97 8 7 6 5 4 3 表示一循环有三轮, 可取的个数为: 第一轮 先手8 后手7 第二轮 先手6 后手5 第三轮 先手4 后手3 然后三轮每取完的话就进入下次循环. 数据范围自己看去吧. 题解: DP就好. 博弈性质:如果当前状态对手怎么走都败,此状态就是胜,不然就是负. 记忆化搜索一下水过. 代码: #include <cstdio> #include

BZOJ 3105: [cqoi2013]新Nim游戏

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1064  Solved: 624[Submit][Status][Discuss] Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游

Nim 游戏、SG 函数、游戏的和

Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于"Impartial Combinatorial Games"(以下简称ICG).满足以下条件的游戏是ICG(可能不太严谨):1.有两名选手:2.两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动:3.对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作.以前的任何操作.骰子的点数

BZOJ1022: [SHOI2008]小约翰的游戏John(Nim博弈)

Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明多了,他从来没有在游戏中犯过错误.小约翰一怒之前请你来做他的参谋.自然,你应该先写一个程序,预测一下谁将获得游戏的胜利. Input 本题的输入由多组数据组成第一行包括一个整数T,

【算法功底】LeetCode 292 Nim Game

You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove th

【BZOJ2019】nim

直播写题这刺激233 原题: 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的.于是vfleaking决定写一个玩Nim游戏的平台来坑玩家.为了设计漂亮一点的初始局面,vfleaking用以下方式来找灵感:拿出很多石子,把它们聚成一堆一堆的,对每一堆编号1,2,3,4,...n,在堆与堆间连边,没有自环与重边,从任意堆到任意堆都只有唯一一条路径可到达.然

Leetcode-292 Nim Game

#292.  Nim Game You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first t