关闭

博弈基础

标签: algorithm博弈
525人阅读 评论(0) 收藏 举报
分类:
博弈基础
一. 基本概念:
1. 组合游戏:
(1) 有两个玩家;
(2) 游戏的操作状态是一个有限的集合(比如:限定大小的棋盘);
(3) 游戏双方轮流操作;
(4) 双方的每次操作必须符合游戏规定;
(5) 当一方不能将游戏继续进行的时候,游戏结束,同时,对方为获胜方;
(6) 无论如何操作,游戏总能在有限次操作后结束;

2. 必败点(P点):前一个选手(Previous player)将取胜的位置称为必败点。

3. 必胜点(N点):下一个选手(Next player)将取胜的位置称为必胜点。 

二. 必败/必胜点属性:
1. 所有终结点是必败点(P点);
2. 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点);
3. 无论如何操作,从必败点(P点)都只能进入必胜点(N点)。

三. 一般解题策略:
1. 将所有终结位置标记为必败点(P点);
2. 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点);
3. 如果从某个点开始的所有一步操作都只能进入必胜点(N点),则将该点标记为必败点(P点);
4. 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。

例子:
hdu 1846
题意:
1. 本游戏是一个二人游戏;
2. 有一堆石子一共有n个;
3. 两人轮流进行;
4. 每走一步可以取走1…m个石子;
5. 最先取光石子的一方为胜;
求谁先赢。

限制;
1 <= n, m <= 1000

思路:
博弈的基本概念。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1005;
bool dp[N];
int n,m;
bool win(int x){
	for(int i=1;i<=m;++i){
		int tmpx=x-i;
		if(tmpx>=0 && dp[tmpx]==0) return true;
	}
	return false;
}
bool fail(int x){
	for(int i=1;i<=m;++i){
		int tmpx=x-i;
		if(tmpx<0) continue;
		if(dp[tmpx]!=1) return false;
	}
	return true;
}
void gao(int n,int m){
	memset(dp,0,sizeof(dp));
	dp[0]=0;
	for(int i=1;i<=n;++i){
		if(win(i)) dp[i]=1;
		else if(fail(i)) dp[i]=0;
	}
	if(dp[n]) puts("first");
	else puts("second");
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		gao(n,m);
	}
	return 0;
}



0
0
查看评论

ACM博弈学习小结

1.ACM博弈题,不会的时候觉得难于上青天,会的时候觉得没有比博弈更水的题了; 博弈题看到的第一眼觉得是难题,代码敲完顿觉水题。你可能花半个小时去找规律,然后仅花2分钟敲代码。 2.博弈是单人游戏,也可以说是自己跟自己玩,因为“双方都做出最优决策”这一点限制了,最后的结果不取决 于你是谁,不取决于你...
  • tomorrowtodie
  • tomorrowtodie
  • 2016-08-10 00:54
  • 1283

POJ 1678 I Love this Game!(博弈DP)

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 题意:有N个数,有...
  • ACM_cxlove
  • ACM_cxlove
  • 2012-08-09 10:59
  • 3340

ACM中的博弈论入门(三) POJ 1740 开点脑洞……

这道题自己琢磨了会儿,没想出来,后来看见要两两考虑,有了思路…… but,重点是题目没好好看……原来取完剩下的可以随意分……而不是只能扔到一堆去…… 考虑  a a 是 L 局面 a a  b b 也是 (A操作 x 堆, B只要【对称】地操作另一个x堆,就会让A...
  • under_sky_dxj
  • under_sky_dxj
  • 2016-07-07 19:54
  • 338

ACM常见组合博弈游戏

这两天认识了几个组合游戏的基础模型,希望自己能更新下去。。Ferguson游戏Description Initial 有两个盒子,一个装有 m 颗糖,一个装有 n 颗糖,表示为 (m, n) . Step 每次清空一个盒子,将另一个盒子里的糖转移一些过来,并保证两个盒子至少各有一颗糖。 Win 最后...
  • qq_15714857
  • qq_15714857
  • 2015-11-07 00:03
  • 1756

博弈论基础习题集

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=108499#overview 题目分类: sg函数:A,E,H,I 尼姆博弈:B,C, 巴氏博弈:D,F np点性质或总结规律:G A.题意:每组测试用例包含三个整数m,n,p.以n,m,...
  • qq_30241305
  • qq_30241305
  • 2016-03-10 10:17
  • 607

基础博弈—Nim博弈

重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示位异或(xor)运算。 Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了。 ...
  • Iamallblue
  • Iamallblue
  • 2015-04-14 14:23
  • 284

枪手博弈

枪手博弈 三人同时开枪 三人轮流开枪
  • Vitalia
  • Vitalia
  • 2017-01-12 17:23
  • 680

博弈题目集锦

首先当然要献上一些非常好的学习资料:基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530经典翻硬币游戏小结:http://blog.csdn.net/acm_cxlove/article/details/7854534经典的删...
  • feizaoSYUACM
  • feizaoSYUACM
  • 2017-02-02 12:51
  • 337

博弈问题之三大博弈

一.巴什博奕(Bash Game): 首先我们来玩一个比较古老的报数游戏。A和B一起报数,每个人每次最少报一个,最多报4个。轮流报数,看谁先报到30. 如果不知道巴什博弈的可能会觉得这个是个有运气成分的问题,但是如果知道的人一定知道怎样一定可以赢。 比如A先报数的话,那么B一定可以赢(这里假定...
  • Roosevelty
  • Roosevelty
  • 2015-02-19 09:42
  • 565

博弈-Nim博弈

Nim博弈
  • wximo
  • wximo
  • 2014-05-13 11:19
  • 818
    个人资料
    • 访问:157113次
    • 积分:3617
    • 等级:
    • 排名:第10773名
    • 原创:213篇
    • 转载:3篇
    • 译文:0篇
    • 评论:43条
    最新评论