我無法理解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