递归与动态规划---排成一条线的纸牌博弈问题

【题目】

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

【举例】

  arr = [1, 2, 100, 4]
  玩家A先拿1,玩家B拿4,玩家A再拿100,玩家B再拿2,游戏结束,玩家A获胜,分数为101。

【基本思路】

  首先分析暴力递归的方法。定义递归函数f(i, j)表示如果arr[i…j]这个排列上的纸牌被绝顶聪明的人先拿,最终会获得什么分数。定义递归函数s(i, j),表示如果arr[i…j]这个排列上的纸牌被绝顶聪明的人后拿,最终能获得什么分数。

首先分析f(i, j),具体过程如下:

  1. 如果i == j,表示此时只有一张牌,当然会被先拿牌的人拿走,所以返回arr[i]即可。

  2. 如果i != j,那么此时有两种选择,一种是先拿arr[i],一种是先拿arr[j]。如果先拿走arr[i],那么对于剩下的arr[i+1…j],玩家成了后拿牌的人,所以他能获得的分数为arr[i] + s(i+1, j);同理如果先拿arr[j],那么他能获得的分数为arr[j] + s(i, j-1)。因为玩家是决定聪明的人,所以他会选择两个决策中最优的,即max(arr[i] + s(i+1, j), a

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值