![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
博弈论
hhhcbw
Hello World!!!
展开
-
博弈论(六)——#10248. 「一本通 6.7 练习 5」取石子游戏
题目链接:https://loj.ac/problem/10248#submit_code解题思路神仙题目,迷一般的状态转移,看了yyb大佬的题解,才算明白一点。我们定义L[i][j]表示区间[i,j]左边(即i-1位)加上一堆石子L[i][j],能使先手必败,R[i][j]表示区间[i,j]右边(即j+1位)加上一堆石子R[i][j],能使先手必败。首先,边界L[i][i],R[i][i]肯定是a[i] (Nim博弈)。然后最后只要判断a[1]是否等于L[2][n]就能判断先手必胜还是必败了。再看状原创 2020-09-08 21:41:49 · 410 阅读 · 0 评论 -
博弈论(五)——#10247. 「一本通 6.7 练习 4」S-Nim
题目链接:https://loj.ac/problem/10247解题思路就是一般sg函数的运用,根据每次的s,推出当前情况的sg函数,然后异或,等于0,+“L”,不等于0,+“W”。AC代码#include <iostream>#include <stdio.h>#include <algorithm>#include <cstring>using namespace std;int a[105],s[105];int sg[10005]原创 2020-09-08 16:35:41 · 193 阅读 · 0 评论 -
博弈论(四)——#10246. 「一本通 6.7 练习 3」取石子
题目链接:https://loj.ac/problem/10246解题思路首先,我们将石堆分为热闹堆和寂寞堆,热闹堆的石子数大于1,寂寞堆的石子数等于1。我们设dp[i][j]表示有i个寂寞堆,和j次热闹堆操作下一次操作的人是否能取胜。我们发现,如果只有热闹堆,只需要看当前能操作的数量的奇偶,就能判断之前操作的是否获胜,dp[0][j]=j&1。如果此时有寂寞堆,则要分情况讨论。如果有大于等于两个寂寞堆,我们可以将寂寞堆合并,dp[i][j]=~dp[i-2][j+2]。如果此时还有热闹原创 2020-09-08 16:12:33 · 549 阅读 · 0 评论 -
博弈论(三)——#10245. 「一本通 6.7 练习 2」巧克力棒
题目链接:https://loj.ac/problem/10245解题思路需要对尼姆博弈有深入的了解,这题如果不用取巧克力,就是典型的尼姆博弈。我们知道,尼姆博弈,如果异或和为0则是P态,所以,如果先手拿出几根巧克力异或和不为0,后手就可以使异或和变为0,此时先手再拿,后手又可以通过操作使异或和变为0。所以,先手要想取胜,必须先拿出最大的异或和为0的集合,此时后手无论怎么操作,都会使异或和变为不等于0。所以,如果有异或和为0的集合,先手必胜。如果没有,先手必输。因为n很小,所以直接暴搜判断即可。AC代原创 2020-09-06 20:32:29 · 415 阅读 · 0 评论 -
博弈论(二)——#10244. 「一本通 6.7 练习 1」取石子游戏
题目链接:https://loj.ac/problem/10244解题思路每次取完石子就到一个新的状态,状态图是一个有向无环图,可以利用sg函数解决,如果必胜的话,最小的第一次取可以直接暴力枚举判断得到。AC代码#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;const int maxn=1e3+5;原创 2020-09-06 19:38:55 · 392 阅读 · 0 评论 -
博弈论(一)——#10243. 「一本通 6.7 例 3」移棋子游戏
题目链接:https://loj.ac/problem/10243解题思路因为是一张有向无环图,正好对应有向图游戏和模型,可以利用sg函数异或和求解。我们发现,出度为0的点,不能再移动,是P点,所以其sg函数必是0。其它点的sg函数都可以由其儿子节点推出。所以我们对整张图dfs就可以求得所有点的sg函数(图可能要多次dfs)。然后求对应点sg函数异或和,非0则先手必胜,0则先手必败。AC代码#include <iostream>#include <stdio.h>#inc原创 2020-09-06 16:45:25 · 482 阅读 · 0 评论