数据结构和算法之暴力递归到动态规划01-绝顶聪明纸牌问题

从一开始的暴力递归到傻瓜式的缓存动态规划到最终的动态规划

package day_16;

/**
 * 给定一个整型数组arr,代表数值不同的纸牌排成一条线
 * 玩家A和玩家B依次拿走每张纸牌
 * 规定玩家A先拿,玩家B后拿
 * 但是每个玩家每次只能拿走最左或最右的纸牌
 * 玩家A和玩家B都绝顶聪明
 * 请返回最后获胜者的分数。
 * @Author huawei
 * @Date 2021/5/12 16:44
 * @Version 1.0
 */
public class Code02_CardsInLine{
   
    public static int win1(int [] array){
   
        if(array == null || array.length == 0){
   
            return -1;
        }
        return Math.max(b(array,0,array.length-1),a(array,0,array.length - 1));


    }

    /**
     * 在L...R的范围之内先手
     * @param array
     * @return
     */
    public static int b(int [] array,int L,int R){
   
        if( L == R ){
   
            // 说明只剩一张牌
            return array[L];
        }
        // 先手拿 分为两种情况,第一种,先手拿左 + 后手拿 ,第二种,先手拿右 + 后手拿
        // 这个后手就看成是一个黑盒,因为是绝顶聪明,所以一定会取这两次最大的值
        return Math.max(array[L] + a(array,L + 1,R),array[R] + a(array,L,R - 1));
    }
    public static int a(int [] array,int L,int R){
   
        if(L == R){
   
            // 如果只剩一张牌,因为是后手,所以这张牌一定被对方的先手拿走,因为是绝顶聪明
            return 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值