切換
舊版
前往
大廳
主題

ZeroJudge - d806: 水火不容 解題心得

Not In My Back Yard | 2020-08-22 00:01:58 | 巴幣 0 | 人氣 115

題目連結:


題目大意:
第一列給定一正整數 n (n ≦ 10000000),代表有 n 顆各自寫著數字的石頭。接著一列給定 n 個正整數(皆 ≦ 1000000000),代表每顆石頭上的數字。

現在有兩人,每人在自己的回合可以拿任意數量的石頭,而該回合得分為拿取的石頭裡的最小值。試問,在兩個人都採取最佳策略下,先手的總得分最多可以贏後手幾分?



範例輸入:
3
3 1 1


範例輸出:
2


解題思維:
先依據石頭上的數字大小由小到大排序。並命名為 S1 、 S2 、 …… 、 Sn。因為已排序過了,所以這些數字滿足 S1 ≦ S2 ≦ …… ≦ Sn (等等會用到這個性質)。

而現在這個問題可以使用動態規劃(Dynamic Programming,DP)解出。我們定義 Di 為 S1 、 S2 、 …… 、 Si 這個局面,其先手與後手的「最大」分數差值。並特別定義一數 D0 = 0 (沒有任何石頭可拿,雙方差距 0 分)。

現在來看 Di 與 Di-1 的關係,可以看到
Di = max(Di-1, Si - Di-1)
為什麼呢?我們分別討論 max 的逗號「,」左右兩邊的情況。

Di-1 代表的是:將 Di-1 的先手第一步所拿的石頭多加上現在這個石頭,也就是 Si 。因為 S1 ≦ S2 ≦ …… ≦ Si ,所以加入現在的 Si 並不會影響先手第一回合的得分(因為得分是看拿的石頭之最小值)。

Si - Di-1 代表:令先手第一回合只拿先在這顆石頭 Si 作為第一回合的得分,因此後手可以仿照 Di-1 的策略去得分,所以先手會與後手差 Si - Di-1 分。

兩種情況的最大值即是我們要求的 Di 。而 Dn 即是題目的所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

胖胖貓
排序的這個性質是基於 拿走石頭當中是以分數最低者作為代表,換句話說每次拿取時"理性玩家"應該會盡量避免選取分數較低者=分數越低的石頭越後面被選取,而動態規劃在更新狀態(Bottom-Up)時是從結束狀態往一開始的狀態回推,所以分數越低的石頭越接近快結束時才選取反而要越優先處理,確保討論到分數越高的石頭時"前面"的狀態已經完成更新,所以才會要求由小到大排序。
2020-08-22 17:43:23
Not In My Back Yard
感謝補充。
2020-08-22 18:00:45

更多創作