拿牌博弈

一、题目

给定一个整型数组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>
posted @ 2022-06-24 21:41  花村店长  阅读(73)  评论(0)    收藏  举报