一個(gè)優(yōu)雅的動(dòng)歸

為了預(yù)防老年癡呆順便維持手感咱筛,一個(gè)程序員應(yīng)當(dāng)時(shí)不時(shí)刷幾道算法題挑戰(zhàn)一下彼妻。記得之前上算法課的時(shí)候嫌佑,我一直認(rèn)為動(dòng)歸的題都是最簡(jiǎn)單的——套路嘛豆茫,遇事不決歸一下(侨歉?)同時(shí),動(dòng)歸的過程總會(huì)給人一種優(yōu)雅的感覺:有的問題看上去那么復(fù)雜揩魂,仿佛一團(tuán)亂麻幽邓,但抽絲剝繭,又總能找到最簡(jiǎn)單的那個(gè)S_{0} 火脉。一生二牵舵,二生三,三生萬(wàn)物倦挂,大道歸一畸颅,是哲學(xué)的優(yōu)雅。感謝計(jì)算機(jī)方援,讓我們不用自己從1數(shù)到萬(wàn)没炒,只要敲下一個(gè)簡(jiǎn)單的for循環(huán),嘬口咖啡的功夫不到犯戏,cpu就幫你把計(jì)算的臟活累活干完送火,正確的答案靜靜地顯示在控制臺(tái)等你審閱。

當(dāng)然了先匪,對(duì)于題目來(lái)說种吸,自然不能都沿用同樣的套路。一些帶著稍許“變形”的題目呀非,能讓你在識(shí)破其中的馬甲時(shí)被刺激出更多的多巴胺坚俗。這篇廢話要記錄的就是這樣一個(gè)不那么標(biāo)準(zhǔn)的動(dòng)歸題:

LeetCode486. 預(yù)測(cè)玩家

給定一個(gè)表示分?jǐn)?shù)的非負(fù)整數(shù)數(shù)組。 玩家 1 從數(shù)組任意一端拿取一個(gè)分?jǐn)?shù)岸裙,隨后玩家 2 繼續(xù)從剩余數(shù)組任意一端拿取分?jǐn)?shù)坦冠,然后玩家 1 拿,…… 哥桥。每次一個(gè)玩家只能拿取一個(gè)分?jǐn)?shù)辙浑,分?jǐn)?shù)被拿取之后不再可取。直到?jīng)]有剩余分?jǐn)?shù)可取時(shí)游戲結(jié)束拟糕。最終獲得分?jǐn)?shù)總和最多的玩家獲勝判呕。

給定一個(gè)表示分?jǐn)?shù)的數(shù)組倦踢,預(yù)測(cè)玩家1是否會(huì)成為贏家。你可以假設(shè)每個(gè)玩家的玩法都會(huì)使他的分?jǐn)?shù)最大化侠草。

簡(jiǎn)單來(lái)說辱挥,可以看做一個(gè)先手問題。兩個(gè)人依次選數(shù)組頭尾任意一個(gè)數(shù)边涕,看誰(shuí)最后拿的數(shù)字和最大晤碘,同時(shí)兩個(gè)人都是拿數(shù)字高手,訓(xùn)練有素功蜓,一般不會(huì)輸除非必須輸园爷。然后根據(jù)數(shù)組判斷先手能不能贏。為了簡(jiǎn)便式撼,在這道題中平局的情況視為先手玩家獲勝童社。

不知道正常人類是否存在這樣的拿數(shù)字高手,反正我不是著隆。不過沒關(guān)系扰楼,現(xiàn)代社會(huì)的人類都知道,一切繁瑣的計(jì)算交給計(jì)算機(jī)嘛美浦。對(duì)于我來(lái)說弦赖,我能一眼看穿的牌面是什么呢:

? 1. 數(shù)組是空的——先手勝。

? 2. 數(shù)組只有一個(gè)數(shù)字——先手勝浦辨。

? 3. 數(shù)組只有兩個(gè)數(shù)字——先手勝蹬竖。

那么,當(dāng)數(shù)組的大小大于2荤牍,誰(shuí)贏呢案腺?

讓我來(lái)假裝自己是一個(gè)拿數(shù)字高手:假設(shè)我可以算出來(lái)這個(gè)數(shù)組我先拿的情況下我最多可以拿到的和是多少,那么我也可以算出來(lái)我拿了頭或者尾后康吵,我的對(duì)手面對(duì)剩下的數(shù)組最多可以拿到多少劈榨。

聽起來(lái)很繞很暈對(duì)不對(duì)?我也覺得晦嵌,所以我們成不了拿數(shù)字高手同辣。不過沒關(guān)系,很繞的邏輯寫成代碼卻很簡(jiǎn)單:

dp[i][j] = max(nums[i] - dp[i+1][j], nums[j] - dp[i][j-1])

其中惭载,`nums`為數(shù)組旱函,`dp[i][j]`為數(shù)組從 `i` 到 `j` 的子數(shù)組中先手與后手得分的差值(即先手得分-后手得分)。這行代碼妙在哪里呢描滔?我們?cè)倏匆谎垲}目:

給定一個(gè)表示分?jǐn)?shù)的非負(fù)整數(shù)數(shù)組棒妨。 玩家 1 從數(shù)組任意一端拿取一個(gè)分?jǐn)?shù),隨后玩家 2 繼續(xù)從剩余數(shù)組任意一端拿取分?jǐn)?shù)含长,然后玩家 1 拿券腔,…… 伏穆。每次一個(gè)玩家只能拿取一個(gè)分?jǐn)?shù),分?jǐn)?shù)被拿取之后不再可取纷纫。直到?jīng)]有剩余分?jǐn)?shù)可取時(shí)游戲結(jié)束枕扫。最終獲得分?jǐn)?shù)總和最多的玩家獲勝。

題目中反復(fù)出現(xiàn)玩家1辱魁,玩家2的概念烟瞧,很容易讓讀者陷入一種思維的禁錮:去思考玩家1和玩家2在拿數(shù)字的時(shí)候各自的路徑選擇問題。但實(shí)際上呢染簇?這個(gè)游戲的本質(zhì)是一個(gè)交替先手的問題参滴,也就是說,不要再管玩家1還是玩家0還是玩家甲乙丙丁了剖笙!想象一個(gè)精分的拿數(shù)字高手自己和自己玩卵洗,他要做的就是讓`dp[i][j]`盡可能的大请唱,然后看看`dp[0][n-1]`(`n`為數(shù)組大忻诌洹)最后是不是大于`0`就完事了!是不是很妙十绑?表面上是兩個(gè)玩家在玩拿數(shù)字聚至,實(shí)際上你中有我我中有你,你的陰謀也是我的陽(yáng)謀本橙,誰(shuí)也不比誰(shuí)高明扳躬,誰(shuí)也不比誰(shuí)愚鈍,就算你背了愛馬仕甚亭,我只拎著小ck贷币,在這場(chǎng)游戲中,我們的結(jié)局早已確定——猜到了這開頭亏狰,也看穿了這結(jié)尾役纹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市暇唾,隨后出現(xiàn)的幾起案子促脉,更是在濱河造成了極大的恐慌,老刑警劉巖策州,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘸味,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡够挂,警方通過查閱死者的電腦和手機(jī)旁仿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)孽糖,“玉大人枯冈,你說我怎么就攤上這事汁胆。” “怎么了霜幼?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵嫩码,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我罪既,道長(zhǎng)铸题,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任琢感,我火速辦了婚禮丢间,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驹针。我一直安慰自己烘挫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布柬甥。 她就那樣靜靜地躺著饮六,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苛蒲。 梳的紋絲不亂的頭發(fā)上卤橄,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音臂外,去河邊找鬼窟扑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛漏健,可吹牛的內(nèi)容都是我干的嚎货。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蔫浆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼殖属!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起克懊,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忱辅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谭溉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墙懂,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年扮念,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了损搬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巧勤,靈堂內(nèi)的尸體忽然破棺而出嵌灰,到底是詐尸還是另有隱情,我是刑警寧澤颅悉,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布沽瞭,位于F島的核電站,受9級(jí)特大地震影響剩瓶,放射性物質(zhì)發(fā)生泄漏驹溃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一延曙、第九天 我趴在偏房一處隱蔽的房頂上張望豌鹤。 院中可真熱鬧,春花似錦枝缔、人聲如沸布疙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灵临。三九已至,卻和暖如春擦酌,著一層夾襖步出監(jiān)牢的瞬間俱诸,已是汗流浹背菠劝。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工赊舶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赶诊。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓笼平,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親舔痪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寓调,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355