博弈归纳和见解

什么是博弈, 博弈又可以解决什么问题?

学完了博弈, 在我看来, 博弈就是通过一些演算寻找到必胜之道;博弈也有很多种类, 比如下:

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 时, 为平衡状态… 奇异局势为平衡状态, 斐波那契数为平衡状态…(前提是两个人非常聪明) ! **

***其他刷题:***在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值