随笔分类 -  博弈

POJ 2311
摘要:SG应用的场景 游戏有两个人参与,二者轮流做出决策。且这两个人的决策都对自己最有利。 当有一人无法做出决策时游戏结束,无法做出决策的人输。无论二者如何做出决策,游戏可以在有限步内结束。 游戏中的同一个状态不可能多次抵达。且游戏不会有平局出现。 任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关。这个题目乍看一眼不满足第二条。因为当一个人剪出一个格子的形状时就结束了,但是此时并不是另一个人无法做出决策。故需要将题目转化一下,规定终止状态为2*2,2*3,3*2这三种,如果一个人达到这个状态,就输了。可令sg[2][2]=sg[2][3]=sg[3][2]=0 阅读全文

posted @ 2012-05-12 19:51 c语言源码 阅读(203) 评论(0) 推荐(0)

SG函数
摘要:适用范围和限制条件:1.甲乙两人取石子游戏及其类似的游戏;2.每一步只能对某一堆石子进行操作;3.每一步操作的限制,只与这堆石子的数目或一些常数有关;4.操作在有限步内终止,并不会出现循环;5.谁无法继续操作,谁就是输家。此类搏弈游戏的一般性解法:用一个n元组(a1,a2,…,an),来描述游戏过程中的一个局面。用符号#S,表示局面S所对应的二进制数。用符号$(x),表示局面(x)的下一步所有可能出现的局面的集合。定义集合g(x):设$(x)={S1,S2,…,Sk},则g(x)={#S1,#S2,…,#Sk}。令非负整数集为全集,集合G(x)表示集合g(x)的补集。定义函数f(n):f(n) 阅读全文

posted @ 2012-05-12 17:19 c语言源码 阅读(295) 评论(0) 推荐(0)

HDU 1848
摘要:sg函数的简单应用#include<cstdio> #include<string.h> using namespace std; int fib[20],sg[1010],m,n,p; int calsg(int now){ int i,tem; int next[20]; memset(next,0,sizeof(next)); for(i=1;fib[i]<=now;i++){ tem=now-fib[i]; if(sg[tem]==-1) sg[tem]=calsg(tem); next[sg[tem]]=1; } for(i=0;;i++) if(n.. 阅读全文

posted @ 2012-05-12 15:14 c语言源码 阅读(148) 评论(0) 推荐(0)

HDU 2147
摘要:/** 博弈论:组合博弈* 必败点(P点) :前一个选手(Previous player)将取胜的位置称为必败点。* 必胜点(N点) :下一个选手(Next player)将取胜的位置称为必胜点。* 必败(必胜)点的属性:* (1) 所有终结点是必败点(P点);* (2) 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点);* (3)无论如何操作, 从必败点(P点)都只能进入必胜点(N点).* 由上面的属性得到该题的算法:* 步骤1:将所有终结位置标记为必败点(P点);* 步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)* 步骤3:如果从某个点开始的所有一步操 阅读全文

posted @ 2012-05-12 12:59 c语言源码 阅读(140) 评论(0) 推荐(0)

导航