硬币游戏

农夫约翰的奶牛喜欢玩名为“Xoinc”的硬币游戏。这是一个两人游戏,涉及堆栈中的N枚硬币,每个硬币有不同的币值。玩家轮流取硬币,最多可取对手上次取硬币数的两倍。问题求解第一个玩家的最大收益。采用倒序策略,定义f[i][j]表示从第i个硬币开始取j个时的最大价值。通过优化转移方程,可以将复杂度降低到O(n^2),目标状态为dp[n][0],表示游戏结束时第一个玩家最多能拿走的硬币总值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:USACO 2009年11月

农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为“Xoinc”的两人硬币游戏。

初始时,一个有N(5 <= N <= 2,000)枚硬币的堆栈放在地上,从堆顶数起的第I枚硬币的币值为C_i (1 <= C_i <= 100,000)。

开始玩游戏时,第一个玩家可以从堆顶拿走一枚或两枚硬币。如果第一个玩家只拿走堆顶的一枚硬币,那么第二个玩家可以拿走随后的一枚或两枚硬币。如果第一个玩家拿走两枚硬币,则第二个玩家可以拿走1,2,3,或4枚硬币。在每一轮中,当前的玩家至少拿走一枚硬币,至多拿走对手上一次所拿硬币数量的两倍。当没有硬币可拿时,游戏结束。 两个玩家都希望拿到最多钱数的硬币。请问,当游戏结束时,第一个玩家最多能拿多少钱呢?

按一个人正常的逻辑思维来讲,这题的倒序做法要比正序做法好理解的多,所以本文采用倒序做法。

设f[i][j]表示其中一个人从第i个开始往后拿j个时的最大价值,注意i是倒序。

因为每次拿双方都采用最优策略,显然f[i][j] = max{sum[i] - f[i - k][k]},初值为f[i][j] = f[i][j - 1],其中k表示前一个人拿了k个硬币.

显然红色部分就是sum[i] - f[i - k][k].

那么这样算这应该是一个O(n^3)的做法。

但是我们会发现f[i][j] = max

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值