【问题标题】:How to improve this Dynamic Programming solution?如何改进这个动态规划解决方案?
【发布时间】:2013-07-08 05:32:16
【问题描述】:

原问题陈述Pile it up

总结:两个玩家 A 和 B 玩由 2 堆 X 和 Y 硬币组成的游戏。每回合他可以做以下其中一项:

  • 从一堆硬币中取出任意数量的硬币(至少 1 个硬币)
  • 从两堆硬币中取出相同数量的硬币
  • 转弯。这仍算一回合。

游戏在无法移动时结束,无法移动的玩家输掉。两名球员都发挥最佳。双方玩家在比赛开始前计算比赛结果。输的玩家试图最大化游戏中的回合数,而获胜的玩家试图最小化回合。没有玩家可以传球超过 P 次。 A 开始游戏。输出获胜者的姓名和游戏中的移动次数,以单个空格分隔。 0

我想出了一个 O(n^3) DP 解决方案,但考虑到界限,它肯定不足以解决这个问题。如果轮到你玩并且 X 和 Y 堆分别剩下 i 和 j 个硬币,则设 d[i, j] 为获胜的最小回合数。然后我们有:

d[i, j] = 0 if i = j = 0
          1 if (i = 0 && j > 0) or (i > 0 && j = 0) or (i = j && i > 0)
          min(min(d[i-p, j]), min(d[i, j-q), min(i-r, j-r)) if a each substate is a losing position
          max of all winning position substate if no losing substate is found

最后,d[i,j] = d[i,j] + 2*P if [i,j] 是一个获胜的状态,你不会从一开始就立即获胜。

从上面的公式可以看出,这是一个 O(n^3) 的解决方案。我想改进对 O(n^2) 的解决方案,如何重新表述问题?

【问题讨论】:

  • “这个游戏的目的”这一段没有意义;请编辑问题并修复它。您可能指的是 player A 你写了 winnerplayer B 你写了 loser
  • @Aravind:i 和 j 是 X 和 Y 堆的剩余硬币数量。
  • 为什么不让获胜者在第一次机会中拿走所有硬币?
  • @jwpat7:我更新了问题,希望现在更清楚了。
  • @sowrov:如果他这样做了,第二个移动的玩家将拿走剩余的非空堆并获胜,因此他不会。因此,第一个行动的人不会做出这样的行动,而是会考虑如何赢得,或者如何延迟对方的胜利。

标签: algorithm dynamic-programming


【解决方案1】:

第一个获胜的位置是

  1. 1 个空桩
  2. 两堆相同数量的硬币

玩家什么时候轮到他?
假设位置是(3,2),那么他有3个选项。

  1. 他可以移动到 (2,2),但这对他的对手来说是一个获胜的位置。
  2. 他可以移动到 (1,0),但这又是他的对手的获胜位置。
  3. 如果他选择跳过回合,那么对手也可以跳过回合。这种跳过最多可以进行P回合。

根据 P 的奇偶性(P 是偶数还是奇数)以及根据谁开始跳过序列,我们可以找出获胜的人。从那里找到转数并不难。

为什么跳过顺序是最优的?
好吧,如果您输了,您会希望在游戏中停留更长时间。(根据游戏规则。)因此,即使我基于 P 的平价知道我会输,我也可以将其延迟 P 回合.有意义吗?
我鼓励您利用这种见解来提高您的算法速度,但如果您在实施它时遇到问题,请务必提出问题!

【讨论】:

  • 谢谢@aravind。不过我要明确一点,P不是游戏中允许的传球总数,每个玩家最多可以传P次(所以游戏中最多有2*P传球) .我想如果下一步将输掉比赛,两个球员都会使用他所有的 P 传球,因为没有人想输。我主要担心的是有 1000*1000 个状态,要填充每个状态,我们需要经过 1000 个子状态,这太慢了。
  • @MinhPham:你真的必须去所有 1000 个子州吗?不,意识到如果你在 (p,q) 那里 p>q 那么你将去 (p-1,q) 或 (p-2,q) 或 (p-q+1,1) 或到 (p-q+2,2)。如果你赢了你想快速赢,如果你输了慢慢输。如果你赢了,贪婪地移动到另一个赢的位置。慢慢通过或移动,这样你就不会很快失去。这比我最初想象的要难。通过一些额外的分析,也许你可以解决它。顺便说一句,好问题!
  • 你能解释一下为什么我们只对这 4 个州开放吗?我理解你想赢快输慢的想法,但我无法理解这4个州的选择。
猜你喜欢
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多