什么是博弈, 博弈又可以解决什么问题?
学完了博弈, 在我看来, 博弈就是通过一些演算寻找到必胜之道;博弈也有很多种类, 比如下:
1.巴什博弈(Bash Game): 其主要就是在一堆中n 个东西中, 两人反复拿东西, 限制每次至少拿一个, 最多拿 m个, 而巴什博弈在我看来就是解决这类问题的一个公式, 记住就行 n/(m+1), 理解的话就是对于m+1个东西, 当1人拿去a个, 另一个拿剩下的, 最后后拿必胜, 因为他最多拿m个,必定会剩下给你, 所以就是要构建 整数个(m+1), 如果一开始时, 就是整数个(m+1)那么先拿则必输了, 如果一开始会多几个, 那么恭喜你,你可以直接构造(m+1)形式, 先手必胜, 过于简单, 不理解记住就行
2.斐波那契博弈:这个比较少见, 记住就行, 一般题目中关键词 每次取只能介于对手取得1倍到两倍之间, 之间预处理斐波那契数列, 判 断 n 是不是斐波那契数, 是则先手必输, 反之则相反
3.威佐夫博弈:判断是不是奇异状态, 先推算出奇异局势, 再将其他的转化, 涉及到黄金分割比, 常见少, 了解
***4.尼姆博弈(nim游戏)(重点掌握): 具体思路, 就是用抑或加上SG函数来解决问题, 在我看来, SG(函数)的SG()值, 就记住, 不在后继情况中的最小整数:
int get_SG(int n) {
if(SG[n]!=-1) return SG[n];
bool vis[101];
memset(vis,false,sizeof(vis));
for(int i=0;i<ans[0];i++) {
if(n-ans[i]<0) break;
SG[n-ans[i]]=get_SG(n-ans[i]);
vis[SG[n-ans[i]]]=true;
}
for(int j=0; ;j++)
if(!vis[j]) {SG[i]=j;return j;}
}
有时还能优化:
while(vis[sg[x]]== x) {
sg[x] ++;
}
**return sg[x];**
这里要注意, vis要放到里面定义, 上次就是被这个卡了一下午, 主要是在递归时,你只设置一个, 下一次会被覆盖掉, 会出错, 就类似于Java中静态数据
具体练习题加题解 :
**练习**
P7589 黑白棋(2021 CoE-II B
P3235 [HNOI2014]江南乐
见解: 博弈板子题, 没有固定, 主要还是思维转变,灵活,
**然后就是我认为博弈, 其实可以理解成一个平衡和不平衡状态(必胜, 必败), eg:巴什博弈整数个(m+1)就是平衡状态, 破坏平衡的人就是必败, 反之维护平衡的人则必胜, 一开始时,是(m+)型,胜利平衡态, 那么谁先动 , 不管怎么动, 哪怕只是动一点点, 也会破坏平衡,必输, 反之 一开始不是平衡状态, 你将其维护成平衡状态, 那么另外一个人必定只有破会平衡, 则你必胜。 nim博弈也是这样, 抑或值为0 时, 为平衡状态… 奇异局势为平衡状态, 斐波那契数为平衡状态…(前提是两个人非常聪明) ! **
***其他刷题:***