我无法理解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)
有两个具体的部分我不明白:
- 在第一行,为什么我们使用范围[开始+ 2,结束]和[开始+ 1,结束 - 1]?它总是抛出一个硬币罐。它不应该[开始+ 1,结束],因为我们把开始的硬币罐拿出来了吗?
- 在第一行中,为什么我们取两个结果的最小值而不是最大值?
- 因为我对两条线为什么会最小以及为什么选择这些特定范围感到困惑,我不确定
a
和b
究竟代表什么?
你确定这是java吗? –
你必须递归地解决每个子任务。 – sp1rs