返回獲勝者的分數

2021-10-24 05:39:22 字數 1162 閱讀 6181

有一排正數,玩家a和玩家b都可以看到。

每位玩家在拿走數字的時候,都只能從最左和最右的數中選擇乙個。玩家a先拿,玩家b再拿,兩人交替拿走所有的數字。

兩人都力爭自己拿到的數的總和比對方多。請返回最後獲勝者的分數。

例如∶5,2,3,4

玩家a先拿,當前他只能拿走5或者4。

如果玩家a拿走5,那麼剩下2,3,4。輪到玩家b,此時玩家b可以選擇2或4中的乙個,如果玩家a拿走4,那麼剩下5,2,3。輪到玩家b,此時玩家b可以選擇5或3中的乙個,…

利用動態規劃求解

public static int win1(int arr)

//返回的是先發或者後發者中的最大值,哪個大哪個就獲勝

int sum = 0;

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

int fvalue = f(arr, 0, arr.length - 1);

return math.max(fvalue, sum - fvalue);

}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++) }}

//先發過程

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

//要麼先那arr[i],然後在i + 1-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)

//剩下兩種決策中差的給你,因為最好的選擇由不得我

//如果先發拿走了arr[i],那我就是在i+1,j中先發

//如果先發拿走了arr[j],那我就是在i,j-1中先發

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

}

1275 找出井字棋的獲勝者

解題思路 1.按照題目的意思,a b一定不會走已經走過的位置,所以遍歷陣列,由於遵守先a後b,所以偶數項就是a走的棋子,存入a陣列中,同時將a中的此點置為1,其他存入b陣列中 2.滿足獲勝的條件只有8種,分別是a或b的橫座標或縱座標相等的點,斜對角線上的點,由於a中各點一定不相等,所以滿足a獲勝的條...

1275 找出井字棋的獲勝者

題目描述 a 和 b 在乙個 3 x 3 的網格上玩井字棋。井字棋遊戲的規則如下 玩家輪流將棋子放在空方格 上。第乙個玩家 a 總是用 x 作為棋子,而第二個玩家 b 總是用 o 作為棋子。x 和 o 只能放在空方格中,而不能放在已經被占用的方格上。只要有 3 個相同的 非空 棋子排成一條直線 行 ...

LeeCode 1832 找出遊戲的獲勝者

題目描述 共有 n 名小夥伴一起做遊戲。小夥伴圍成一圈,按順時針順序從1到n編號。確切地說,從第 i 名小夥伴順時針移動一位會到達第 i 1 名小夥伴的位置,其中 1 i n,從第 n 名小夥伴順時針移動一位會回到第 1 名小夥伴的位置。遊戲遵頊如下規則 從第 1 名小夥伴所在位置開始 沿著順時針方...