【POJ2068】Nim DP博弈

题意:

多组数据

两人轮流操作,n轮一循环,给出总石子数和这n轮每次两人能取的石子上限(下限为1)。

取到最后一颗者输。

比如

3 97 8 7 6 5 4 3

表示一循环有三轮,

可取的个数为:

第一轮 先手8 后手7

第二轮 先手6 后手5

第三轮 先手4 后手3

然后三轮每取完的话就进入下次循环。

数据范围自己看去吧。

题解:

DP就好。

博弈性质:如果当前状态对手怎么走都败,此状态就是胜,不然就是负。

记忆化搜索一下水过。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 30
#define M 10000
using namespace std;
int f[N][M],a[N],n,m;
// 1为败
int dfs(int x,int y)
{
	if(f[x][y]+1)return f[x][y];
	for(int i=max(0,y-a[x]);i<y;i++)// 枚举剩多少石子
		if(!dfs((x+1)%n,i))return f[x][y]=1;
	return f[x][y]=0;
}
int main()
{
//	freopen("test.in","r",stdin);
	while(scanf("%d",&n),n)
	{
		n<<=1,scanf("%d",&m);
		for(int i=0;i<n;i++)scanf("%d",&a[i]);
		memset(f,-1,sizeof(f));
		for(int i=0;i<n;i++)f[i][0]=1;
		if(dfs(0,m))puts("1");
		else puts("0");
	}
}
时间: 2024-10-10 17:37:34

【POJ2068】Nim DP博弈的相关文章

POJ 2068 Nim (dp博弈)

题意: 共n轮,s个石头和两队人,两队人轮流拿,第i轮两队分别只能拿1~M[(2*i-1)%(2*n)]和1~M[(2*i)%(2*n)]个石头,拿到最后那个石头的队输: 就拿最后一组样例来说,循环中共3轮,共97个石头,第一轮两队分别拿不超过8个和7个石头,第二轮6个和5个,第三轮4个和3个,然后又是8个和7个...... Input n S M[1]  M[2] . . . M[2*n] 1 <= n <= 10, 1 <= Mi <= 16, and 1 <= S &l

【HDU3032】【Lasker&#39;s Nim(一种Nim游戏)】Nim or not Nim? Multi-SG博弈、打表

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42652745 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:n堆石子,每次可以从某堆中拿走若干,也可以把此堆分成两个非空堆,谁无法操作了谁输. 题解:首先我们可以打个SG函数来暴力出解,但是显然这会T. 但是不要害怕,我们打完以后发现了一个貌似对的规律: 对于所有的k >= 0,有 sg( 4k+1 ) = 4k+1: sg( 4k+2 ) = 4k+2: sg(

hdu4753 状态压缩dp博弈(记忆化搜索写法)

http://acm.hdu.edu.cn/showproblem.php?pid=4753 Problem Description There is a 3 by 3 grid and each vertex is assigned a number. It looks like JiuGongGe, but they are different, for we are not going to fill the cell but the edge. For instance, adding

Codeforces 15C Industrial Nim 简单博弈

题目链接:点击打开链接 题意: 给定n 下面n行,每行2个数u v 表示有v堆石子:u,u+1,u+2···u+v-1 问先手必胜还是后手必胜 思路: 首先根据Nim的博弈结论 把所有数都异或一下,看结果是0还是非0 而这里因为数字太多所以想优化 那么其实对于一个序列 u, u+1, u+2 ···· 显然 {4,5} {,6,7}, {8,9} 这样2个一组的异或结果就是1 那么只需要把序列分组,分成{偶数,奇数} 然后Y一下.. #include<stdio.h> #include<

HDU 3032 Nim or not Nim? (博弈之求SG函数)

题意:经典Nim博弈游戏变换,给你n堆石子pi,每堆有pi个石子, Alice和Bob轮流取石子,每次可以从任意一堆中拿走任意个石子,也可以将某一堆石子分成两个小堆 (每堆石子个数必须不能为0),先拿完者获胜 思路:求SG函数后找规律: SG函数定义及求法:点击打开链接 #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #in

poj 2068 Nim(博弈dp)

Nim Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1403   Accepted: 791 Description 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).

POJ 2068 Nim#双人dp博弈

http://poj.org/problem?id=2068 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[25][(1<<13)+5];//dp[i][j]表示轮到第i个人取时,剩j个石头 int n,s,m[25]; int DFS(int pos,int remain) { if(dp

[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

poj2975 Nim(经典博弈)

Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5866   Accepted: 2777 Description Nim is a 2-player game featuring several piles of stones. Players alternate turns, and on his/her turn, a player’s move consists of removing one or mor