拿牌博弈
一、题目
给定一个整型数组arr[L...R],元素代表不同的纸牌,2个玩家依次拿走每张纸牌(只能最左或者最右边)请返回最后获胜者的分数
二、思路
1.自然尝试:
对于先手而言,如果先拿L,那么先手在L+1到R上就是后手了;如果先拿R,那么先手在L到R-1上就是后手了。 先手当然拿的是这两种情况的max
对于后手而言,如果先手拿了L,那么就相当于在L+1到R上变成先手了;如果先手拿了R,那么就相当于在L到R-1上变成先手了。后手只能拿到这两种情况的min
三、程序实现
<script>
//定义下标
var arr = [50, 100, 20, 10];
var L = 0;
var R = arr.length - 1;
var win = function (arr) {
if (arr.length === 0) {
return 0
}
var first = f(arr, L, R);
var second = g(arr, L, R)
return Math.max(first, second)
}
//先手的人进行拿牌
var f = function (arr, L, R) {
if (L === R) {
return arr[L];
}
var p1 = arr[L] + g(arr, L + 1, R); //先手拿L,那先手在L+1-R上就是后手了
var p2 = arr[R] + g(arr, L, R - 1);
return Math.max(p1, p2)
}
//后手的人进行拿牌
var g = function (arr, L, R) {
if (L === R) {
return 0;
}
var p1 = f(arr, L + 1, R); //先手拿L,那后手在L+1-R上就是先手了
var p2 = f(arr, L, R - 1);
return Math.min(p1, p2)
}
console.log('结果:110');
console.log(win(arr));
</script>

浙公网安备 33010602011771号