【发布时间】:2014-03-05 10:39:05
【问题描述】:
我无法理解this question on CareerCup 解决方案背后的原因。
金罐游戏:A 和 B 两个玩家。安排了金罐 在一条线上,每个都包含一些金币(玩家可以看到如何 每个金罐里都有很多硬币——完美的信息)。他们得到 交替轮流,玩家可以从其中一个中选择一个底池 线的末端。获胜者是拥有更高数字的玩家 最后的硬币。目标是“最大化” A 收集的硬币,假设 B 也玩得最好。 A 开始 游戏。
我们的想法是找到一个最优策略,让 A 知道 B也打得很好。你会怎么做?
最后我被要求编写这个策略!
这是来自 Google 采访的问题。
建议的解决方案是:
function max_coin( int *coin, int start, int end ):
if start > end:
return 0
// I DON'T UNDERSTAND THESE NEXT TWO LINES
int a = coin[start] + min(max_coin(coin, start+2, end), max_coin(coin, start+1, end-1))
int b = coin[end] + min(max_coin(coin, start+1,end-1), max_coin(coin, start, end-2))
return max(a,b)
有两个具体部分我不明白:
- 在第一行中,为什么我们使用范围 [start + 2, end] 和 [start + 1, end - 1]?它总是遗漏一个硬币罐。不应该是 [start + 1, end] 因为我们取出了起始硬币罐吗?
- 在第一行中,为什么我们取两个结果中的最小值而不是最大值?
- 因为我对为什么这两条线取最小值以及为什么我们选择这些特定范围感到困惑,所以我不确定
a和b究竟代表什么?
【问题讨论】:
-
你确定是java吗?
-
你必须递归地解决每个子任务。
标签: algorithm