1 条题解
-
0
「切糕游戏」题解
问题分析
这是一个两人零和博弈问题:Kiana 切糕并选择顺序,Tinytree 决定是否使用优先选糕权。两人都足够聪明,目标是最大化自己获得的切糕总量。
关键观察
-
游戏过程:
- Kiana 选择一块糕切成两份(可以任意比例)
- Tinytree 决定是否使用优先权
- 选择完成后,剩余优先权次数会减少(如果使用了)
-
博弈结构:
- 这是一个完全信息博弈:双方都知道所有糕的大小
- 这是一个序贯博弈:Kiana 先行动,然后 Tinytree 响应
- 双方都采取最优策略
问题转化
单个切糕的博弈分析
考虑当前只剩一块大小为 的糕,Tinytree 还剩 次优先权:
-
如果 Tinytree 没有优先权():
- Kiana 会将糕切成
- 自己选择 ,Tinytree 得到
- Kiana 收益:
-
如果 Tinytree 有优先权():
- 设 Kiana 将糕切成 ,其中 (不失一般性设 )
- Tinytree 的决策:
- 如果使用优先权,会选择较大的 ,Kiana 得到
- 如果不使用,Kiana 会选择较大的 ,Tinytree 得到
- Tinytree 会比较:(使用优先权) vs (不使用)
- 因此 Tinytree 会使用优先权当且仅当 ,即
Kiana 的优化问题:选择 最大化自己的收益:
- 如果 :Tinytree 使用优先权,Kiana 得到
- 如果 :Tinytree 不使用优先权,Kiana 得到
因此最优策略是:
- 如果想让 Tinytree 使用优先权,则设 尽可能大但仍小于
- 如果想让 Tinytree 不使用优先权,则设
- 实际上,最优的 ,其中 是一个临界值
多个切糕的动态规划
我们需要考虑剩余优先权次数对博弈的影响。
定义 :考虑从第 块到第 块糕(排序后),Tinytree 还剩 次优先权时,Kiana 能获得的最大总大小。
状态转移
假设我们已按从大到小排序了糕的大小:
对于当前糕 和剩余优先权 :
-
Tinytree 没有优先权():
-
Tinytree 有优先权(): 设 Kiana 将 切成 ,
Tinytree 的决策:
- 使用优先权:得到 ,消耗1次优先权,剩余
- 不使用:得到 ,剩余
Tinytree 会选择对自己更有利的方案,即比较:
- (使用)
- (不使用)
设临界值 使得两者相等:
解得:
现在 Kiana 选择 来最大化收益:
- 如果 :Tinytree 使用优先权,Kiana 得到
- 如果 :Tinytree 不使用优先权,Kiana 得到
因此 Kiana 的最优选择是:
- 如果 :设 ,Tinytree 不使用优先权,Kiana 得到
- 如果 :设 ,Tinytree 使用优先权,Kiana 得到
- 否则:设 ,Tinytree 使用优先权,Kiana 得到
综上:
$$dp[i][j] = \begin{cases} a_i + dp[i+1][j], & \text{if } p \leq 0 \\ \frac{a_i}{2} + dp[i+1][j-1], & \text{if } p \geq \frac{a_i}{2} \\ p + dp[i+1][j-1], & \text{otherwise} \end{cases}$$
边界条件
当 (最后一块糕):
- (Tinytree 无优先权)
- ,(Tinytree 有优先权)
算法步骤
步骤1:预处理
- 读取 和
- 将糕按大小从大到小排序:
步骤2:动态规划
- 初始化 (没有糕时收益为0)
- 计算最后一块糕:
- 对于 到 :
- 从 递减到 :
- 对于 到 :
- 计算
- 根据 的值选择策略,计算
步骤3:输出结果
输出 ,保留6位小数。
复杂度分析
- 排序:
- 动态规划:状态数 ,转移 ,总
- 总复杂度:
- 对于 ,,可接受
正确性证明
1. 排序的正确性
将糕从大到小排序是合理的,因为:
- 游戏是序贯的,先处理大糕还是小糕不影响最优解
- 从大到小排序使得动态规划更容易分析
2. 状态转移的正确性
对于每个状态 :
- Kiana 考虑当前糕 的切法
- Tinytree 根据 Kiana 的切法决定是否使用优先权
- 双方都采取最优策略,形成子博弈完美均衡
3. 临界值 的意义
是 Tinytree 使用和不使用优先权无差异的切法。Kiana 可以通过控制 的值来影响 Tinytree 的决策,从而最大化自己的收益。
示例验证
以样例为例:
排序后:
计算过程:
- $dp[4][0]=1, dp[4][1]=0.5, dp[4][2]=0.5, dp[4][3]=0.5$
- 计算 :
- ,所以 等等...
最终 ,与样例一致。
总结
本题是一个经典的博弈论+动态规划问题:
- 将复杂的博弈过程转化为动态规划状态
- 通过分析单步博弈找到最优策略
- 利用排序简化问题
- 最终得到高效算法
-
- 1
信息
- ID
- 5898
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者