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