说到自己,就是个笑话。思考问题从不清晰,sg函数的问题证明方法就在眼前可却要弃掉。不过自己理解的也并不透彻,做题也不太行。耳边时不时会想起alf的:“行不行!”
基本的小概念
- 这里我们讨论的是公平游戏(ICG游戏:Impartial Combinatorial Games),满足:
1.双方每步的限制相同(轮流)
2.游戏有尽头 - 对于当前局面的玩家如果能有必胜策略,那就是N局面(反之,P局面)
SG函数
- 每一种决策以及后面的所有可能可以抽象成有向无环图,而sg函数的计算就类似图上dp的过程。
- 若当前的局面是now,下一步的局面为to
表示,最小的没有在集合里的非负整数
这就是SG的定义了,这很迷糊,因为它就是一个当前局面的估价,很难说它具体是什么意义(甚至后面还会用它来运算就离谱) - 显然的性质
1.SG[now]后面存在了sg为0的局面,now就为N局面,你接下来你的操作也会move到这种局面。
2.1的反之。
3.SG为0表示当前局面P,否则为N。(ps.三个点就是一个结论,3总结1,2) - Muiti-SG的性质(见nim游戏后)
nim游戏
- 这是最基本最重要的游戏,理解它后,你将入门博弈。
- 规则:两个人玩nim游戏,有n堆石子,每堆有个,每次可从一堆中取走任意多个石子。如果一个人无石子可取就输。
- 结论:是0就为P局面,否则N局面。
- 证明:如果xorsum=0,取后xorsum!=0; 如果xorsum!=0,一定存在从一堆(堆i)取走个石子,使取后
然后最终输的状态为全0,这是xorsum=0的。而如果一开始为xorsum=0一定被拿捏,一直xorsum=0直到输掉(对面就一直使你xorsum=0) - 这时,你肯定会想:用sg暴力做呢?状态存不下啊。当然就引出了后面有关sg的重要推论……
不过对于只有一堆(或者想成n堆每堆独立)的。(i为还剩的石子个数)
重要推论
- 从上面,或许我们能猜想:
S局面被拆分成个相互独立的小局面,(我们这里叫S为的游戏和,满足:
这个对于公平游戏来讲,居然是正确的。证明?-> - 证明:
我们通常遇到博弈想最终态(P态为多,因为sg=0)
当然是所有sg值全为0的时候。
你每次只能转移一个小局面(一堆石子),它能转移到0~sg[i]-1以及sg[i]+k,k是不确定的。
你发现如果没有sg[i]+k我们可以用nim游戏来证明。
如果有,相当于加石子,实质上还是符合nim游戏证明中的异或和总是=0和!=0相交替。
加和减因此也没有实质区别,就得证。 - ps.老板告诉我们可以把任何ICG问题转化为相同sg值(=石子个数)的nim游戏。
小结:
nim类,或者ICG类都感觉核心就用到以上几个结论。不过我太菜了,还是做不来题。博弈论还有很多值得探索,不过现实中人也没有那么理性,很多时候也用不到。
有趣题目:
1.字符游戏
- 思路:首先01串+构造长度为L+前缀关系,很容易想到trie树。
因为“互异”,所以每次更新trie树从根开始的一条链,链叶的子树里的点下次就不可以被选择了。
然后我们通过画图找规律,然后每个点的SG值为lowbit(子树深度),画一下就知道了 - 代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
int go[N][2],nd;
ll lowbit(ll u) {return u&(-u);}
ll ans=0;
char s[N];
void Insert() {
int u=0,len=strlen(s);
for(int i=0;i<len;i++) {
int x=s[i]-'0';
if(!go[u][x]) go[u][x]=++nd;
u=go[u][x];
}
}
void dfs(int u,ll dep) {
if(go[u][0]) dfs(go[u][0],dep-1);
else ans^=lowbit(dep);
if(go[u][1]) dfs(go[u][1],dep-1);
else ans^=lowbit(dep);
}
int main() {
int n;ll l;
scanf("%d%lld",&n,&l);
for(int i=1;i<=n;i++) {
scanf("%s",s);
Insert();
}
dfs(0,l);
if(ans)printf("Alice");
else printf("Bob");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人