【发布时间】: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 你写了 winner 和 player B 你写了 loser。
-
@Aravind:i 和 j 是 X 和 Y 堆的剩余硬币数量。
-
为什么不让获胜者在第一次机会中拿走所有硬币?
-
@jwpat7:我更新了问题,希望现在更清楚了。
-
@sowrov:如果他这样做了,第二个移动的玩家将拿走剩余的非空堆并获胜,因此他不会输。因此,第一个行动的人不会做出这样的行动,而是会考虑如何赢得,或者如何延迟对方的胜利。
标签: algorithm dynamic-programming