BZOJ 3895 取石子 博弈论+记忆化搜索

博客探讨了BZOJ 3895题目的解决方案,通过分析特殊情况下石子操作的奇偶性,得出先手必胜或必败的条件。接着,引入二元组(a, b)来表示有a个大小为1的堆和操作数为b的状态,并利用记忆化搜索的方法解决一般情况,其中a和b的范围有限,从而实现暴力求解。" 107592775,7919609,员工满意度预测:传统机器学习模型大比拼,"['机器学习', '数据挖掘', '数据分析', '逻辑回归', '回归树']
摘要由CSDN通过智能技术生成

题目大意:给定n堆石子,两人轮流操作,每个人可以合并两堆石子或拿走一个石子,不能操作者输,问是否先手必胜

直接想很难搞,我们不妨来考虑一个特殊情况

假设每堆石子的数量都>1

那么我们定义操作数b为当前石子总数+当前堆数-1

若b为奇数,则先手必胜,否则后手必胜

证明:

若当前只有一堆,则正确性显然

否则:

若b为奇数,那么先手只需进行一次合成操作,此时操作数会-1,且仍不存在大小为1的堆

因此只需要证明b为偶数时先手必败即可

若先手选择了合成操作,那么操作数-1且不存在大小为1的堆,状态回到了b为奇数的状态

若先手取走了某个大小>=3的堆中的一个石子,那么操作数-1且不存在大小为1的堆,状态回到了b为奇数的状态

若先手取走了某个大小为2的堆中的一个石子,那么后手只需要将另一个石子与其它堆合成,b的奇偶性不变且仍不存在大小为1的堆

故b为偶数时先手必败


现在回到一般情况 可能存在大小为1的堆

我们设有a个大小为1的堆,其余堆的操作数为b

那么当前的状态就可以用一个二元组(a,b)来表示

容易发现a<=50,b<=50049

于是枚举每种操作暴力记忆化搜索即可


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 10
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值