算法博弈论
博弈论
思路:以为如果要赢的话,就得选全部对自己而言点数大的 其实不是,如果一个点数 b 对于对手而言很大,然后此时轮到自己先手,那么,为了不让对手下一轮拿到比自己更多的分,此时也应该选 b
所以,对石头而言,它的点数,应该是两个玩家预期的点数之和,每次我们要拿的,应该是对于大家而言点数最大的石头
参考Leetcode题目1686
import java.util.Arrays;
public class P1686 {
public static void main(String[] args) {
new P1686().stoneGameVI(new int[]{1,3},new int[]{2,1});
}
// 博弈论
// 思路:以为如果要赢的话,就得选全部对自己而言点数大的
// 其实不是,如果一个点数 b 对于对手而言很大,然后此时轮到自己先手,那么,为了不让对手下一轮拿到比自己更多的分,此时也应该选 b
// 所以,对石头而言,它的点数,应该是两个玩家预期的点数之和,每次我们要拿的,应该是对于大家而言点数最大的石头
public int stoneGameVI(int[] aliceValues, int[] bobValues) {
int n = aliceValues.length;
int aliceSum = 0, bobSum = 0;
int[][] values = new int[n][3];
for (int i = 0; i < n; i++) {
values[i][0] = aliceValues[i] + bobValues[i];
values[i][1] = aliceValues[i];
values[i][2] = bobValues[i];
}
Arrays.sort(values, (a, b) -> b[0] - a[0]);
for (int i = 0; i < n; i++) {
if (i % 2 == 0){
aliceSum+=values[i][1];
}else{
bobSum+=values[i][2];
}
}
if (aliceSum > bobSum) {
return 1;
} else if (aliceSum == bobSum) {
return 0;
} else {
return -1;
}
}
}