博弈问题-轮流取牌(暴力递归,记忆化搜索,动态规划)

本文探讨了一种博弈问题,即两个玩家A和B轮流从一排纸牌中取牌,A先手,B后手。每个玩家只能取最左边或最右边的牌。玩家都非常聪明,问题求解最后的赢家。文章通过暴力递归、记忆化搜索和动态规划三种方法来解决此问题。暴力递归中,定义了两个递归函数分别代表先手和后手的最大得分。记忆化搜索通过记录子问题结果避免重复计算。动态规划则进一步优化,沿用暴力递归的基本思想,实现高效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个整数数组arr,代表不同的纸牌排成一条线,玩家A和玩家B依次拿走每张牌,规定A玩家先拿,B玩家后拿, 但是每个玩家只能拿走最左侧或者最右侧的纸牌 玩家A和玩家B都是绝顶聪明的,请返回最后获胜者的分数;

暴力递归
1.基本思想,定义两个递归函数,第一个先手在一个范围上取的获得最大值;第二个函数在一个范围上后手获取的最大值;
2.范围先手最大值 = MAX(取左侧之后+在剩下范围的最为后手,取右侧后 + 剩下范围作为后手);
3.范围后手最大值 = MIN(先手取左侧剩下范围的我最为先手,先手取右侧 剩下范围我作为先手);

暴力解法

 /**
     * 递归版本
     */
    private int getCarInLineRecur(int[] arr) {
        if (arr.length == 0) {
            return 0;
        }
        return Math.max(first(arr, 0, arr.length - 1),
                second(arr, 0, arr.length - 1));
    }


 /**
     * 先手取牌的最大值
     */
    private int first(int[] arr, int L, int R) {
        if (L == R) return arr[L];

        return Math.max(arr[L] + second(arr, L + 1, R), //先手取左侧的值,在[L+1,R] 进行后手取牌
                arr[R] + sec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值