動態規劃 排成一條線的紙牌博弈問題

2021-07-23 15:30:47 字數 1251 閱讀 8760

【題目】

給定乙個整型陣列arr,代表數值不同的紙牌排成一條線。玩家a和玩家b依次拿走每張紙牌,規定玩家a先拿,玩家b後拿,但是每個玩家每次只能拿走最左或最右的紙牌,玩家a和玩家b都絕頂聰明。請返回最後獲勝者的分數。

【舉例】

arr=[1,2,100,4]。

開始時玩家a只能拿走1或4。如果玩家a拿走1,則排列變為[2,100,4],接下來玩家b可以拿走2或4,然後繼續輪到玩家a。如果開始時玩家a拿走4,則排列變為[1,2,100],接下來玩家b可以拿走1或100,然後繼續輪到玩家a。玩家a作為絕頂聰明的人不會先拿4,因為拿了4之後玩家b將拿走100。所以玩家a會先拿1,讓排列變為[2,100,4],接下來玩家b不管怎麼選,100都會被玩家a拿走。玩家a會獲勝,分數為101。所以返回101。

arr=[1,100,2]。

開始時玩家a不管拿1還是2,玩家b作為絕頂聰明的人,都會把100拿走。玩家b會獲勝,分數為100。所以返回100。

public class problem_14_cardsinline 

return math.max(f(arr, 0, arr.length - 1), s(arr, 0, arr.length - 1));

} public static int f(int arr, int i, int j)

return math.max(arr[i] + s(arr, i + 1, j), arr[j] + s(arr, i, j - 1));

} public static int s(int arr, int i, int j)

return math.min(f(arr, i + 1, j), f(arr, i, j - 1));

} public static int win2(int arr)

int f = new int[arr.length][arr.length];

int s = new int[arr.length][arr.length];

for (int j = 0; j < arr.length; j++)

} return math.max(f[0][arr.length - 1], s[0][arr.length - 1]);

} public static void main(string args) ;

system.out.println(win1(arr));

system.out.println(win2(arr));

}}

動態規劃 排成一條線的紙牌博弈等問題

有乙個整型陣列a,代表數值不同的紙牌排成一條線。玩家a和玩家b依次拿走每張紙牌,規定玩家a先拿,玩家b後拿,但是每個玩家每次只能拿走最左或最右的紙牌,玩家a和玩家b都絕頂聰明,他們總會採用最優策略。請返回最後獲勝者的分數。給定紙牌序列a及序列的大小n,請返回最後分數較高者得分數 相同則返回任意乙個分...

排成一條線的紙牌博弈問題

問題描述 給定乙個整型陣列,代表數值不同的紙牌排成一條線。玩家a和玩家b依次拿走每張紙牌,規定玩家a先拿,玩家b後拿。但是每個玩家每次只能拿走最左或者最右的紙牌,玩家a和b都絕頂聰明,請返回最後獲勝者的分數。解答 定義乙個函式 func int arr 用來表示最優結果,那麼針對第乙個人是先拿第一張...

排成一條線的硬幣博弈問題

面值為正數的硬幣放置成一排,玩家1和玩家2輪流拿走硬幣,規定每個玩家在拿硬幣時,只能拿走最左或最右的硬幣。例如 硬幣面值與排列為 1,2,3,4,5,現在輪到玩家1拿硬幣。在當前狀態下,玩家1只能拿走1或5,如果玩家1拿走1,則排列變為2,3,4,5,那麼接下來玩家2可以拿走2或5,然後繼續輪到玩家...