排成一条线的纸牌博弈问题
題目】
給定一個(gè)整型數(shù)組arr,代表數(shù)值不同的紙牌排成一條線。玩家A和玩家B依次拿走每張紙牌,規(guī)定玩家A先拿,玩家B后拿,但是每個(gè)玩家每次只能拿走最左邊或者最右邊的一張牌,最后所拿牌累加和最大的玩家獲勝,玩家A和玩家B都絕頂聰明。請(qǐng)返回最后獲勝者的分?jǐn)?shù)。
【舉例】
arr = [1, 2, 100, 4]?
玩家A先拿1,玩家B拿4,玩家A再拿100,玩家B再拿2,游戲結(jié)束,玩家A獲勝,分?jǐn)?shù)為101。
【基本思路】
首先分析暴力遞歸的方法。定義遞歸函數(shù)f(i, j)表示如果arr[i…j]這個(gè)排列上的紙牌被絕頂聰明的人先拿,最終會(huì)獲得什么分?jǐn)?shù)。定義遞歸函數(shù)s(i, j),表示如果arr[i…j]這個(gè)排列上的紙牌被絕頂聰明的人后拿,最終能獲得什么分?jǐn)?shù)。
首先分析f(i, j),具體過程如下:
如果i == j,表示此時(shí)只有一張牌,當(dāng)然會(huì)被先拿牌的人拿走,所以返回arr[i]即可。
如果i != j,那么此時(shí)有兩種選擇,一種是先拿arr[i],一種是先拿arr[j]。如果先拿走arr[i],那么對(duì)于剩下的arr[i+1…j],玩家成了后拿牌的人,所以他能獲得的分?jǐn)?shù)為arr[i] + s(i+1, j);同理如果先拿arr[j],那么他能獲得的分?jǐn)?shù)為arr[j] + s(i, j-1)。因?yàn)橥婕沂菦Q定聰明的人,所以他會(huì)選擇兩個(gè)決策中最優(yōu)的,即max(arr[i] + s(i+1, j), arr[j] + s(i, j-1))。
接下來分析s(i, j),具體過程如下:
如果i == j,表明此時(shí)只有一張牌,對(duì)于后拿牌的人來說,他肯定拿不上,說以返回 0。
如果i != j,那么此時(shí)玩家的拿牌方式其實(shí)受到對(duì)手的影響,如果對(duì)手選擇的是arr[i]那么給玩家留下的就是arr[i+1…j],對(duì)于排列arr[i+1…j]玩家成了先拿牌的人,所以他能得到的分?jǐn)?shù)為f(i+1, j)。同理,如果對(duì)手選擇的是arr[j]那么給玩家留下的就是arr[i…j-1],對(duì)于排列arr[i…j-1]玩家成了先拿牌的人,所以他能得到的分?jǐn)?shù)為f(i, j-1)。因?yàn)閷?duì)手也是絕頂聰明的,所以留給玩家的一定是最壞的情況,所以玩家只能選擇兩個(gè)決策中最差的,即max(f(i+1, j), f(i, j-1))
?
?
總結(jié)
以上是生活随笔為你收集整理的排成一条线的纸牌博弈问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器人达到指定位置方法数
- 下一篇: 矩阵的最小路径和