纸牌博弈问题

博客探讨了一个涉及纸牌的博弈问题,其中两位绝顶聪明的玩家轮流从一端取牌。通过递归和动态规划的方法,分析了如何确定先手或后手玩家能够获得最高分数。给出了递归实现和动态规划优化的策略,最终通过比较F和S矩阵的值来确定获胜者的分数。
摘要由CSDN通过智能技术生成

题目:有一个整型数组A,代表数值不同的纸牌排成一条线。玩家a和玩家b依次拿走每张纸牌,规定玩家a先拿,玩家b后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家a和玩家b都绝顶聪明,他们总会采用最优策略。请返回最后获胜者的分数。给定纸牌序列A及序列的大小n,请返回最后分数较高者得分数(相同则返回任意一个分数)。

测试样例:
[1,2,100,4],4
返回:101

解析:

a和b都是绝顶聪明,他们每次拿元素时,肯定是按对自己最有力的方式拿。该题目先由最普通的递归解法,然后进行优化,到动态规划。

递归方式,对数组arr,元素数为n。

F(arr, l , r)表示对于数组arr,元素从l到r,先拿可以达到的最大分数;

S(arr, l, r)表示对于数组arr, 元素从l到r,后拿可以达到的最大分数。

对于F(arr, l, r),先拿时,有两种拿法,拿第一个arr[l],或最后一个arr[r];如果拿arr[l],那么剩余的arr[l+1,....r]能拿到的最大分数为S(arr, l+1, r),分数为arr[l] +S(arr, l+1, r); 如果拿arr[r],剩余的arr[l, ...r-1]能拿到的最大分数为S(arr, l, r-1),分数为arr[r] + S(arr, l, r-1),因为对于先拿后剩余的数组,当前人再拿的话是后拿的,然后取这两种拿法较大的分数。

对于S(arr, l, r),如果前一个人先拿了arr[l],则后拿的分数为F(a

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值