题目描述:

给定一个整形数组arr,代表数值不同的纸牌排成一条线
玩家A和玩家B一次拿走每张纸牌
规定玩家A先拿,玩家B后拿
但是每个玩家每次只能只能拿走最左或者最右的纸牌
双方玩家都会使得对方在改变策略的情况下,对方不会获得更大收益
请问最后获胜者的分数?

思路分析:

同一个轮次,面对同样的L R, 先手必然会选较大的值,后首面对的也是同样的L R,但因为是先手选完之后才选择,所以 只能选其中较小的值。

详解:

定义两个函数: F( arr, L, R),表示在[L,R]上,先手选择可以获得的最大分数。S( arr, L, R),表示在[L,R]上,后手选择可以获得的最大分数

先手F( arr, L, R)函数:

base case: 当只有一张牌(L==R),只能选择该张牌

选L:如果选择的是 L位置上的牌,那么接下来会选 [L+1,R]上 后手选择可以获得的最大分数,即 S(arr,L+1,R),此时最大得分是 arr[L]+S(arr,L+1,R);

选R:如果选择的是 R位置上的牌,那么接下来会选 [L,R-1]上 后手选择可以获得的最大分数,即 S(arr,L,R-1),此时最大得分是 arr[R]+S(arr,L,R-1);

决策:最后选择以上两种情况的较大值,作为自己的分数

后手S(arr,L,R)函数:

base case: 当只有一张牌(L==R),由于是后手选择,当对手把该张牌选走,就没有牌,即 得分为0

如果对手先手挑走了L:此时就相当于我们在[L+1,R]上 先手选择可以获得的最大分数,即F( arr, L+1, R)

如果对手先手挑走了R:此时就相当于我们在[L,R-1]上 先手选择可以获得的最大分数,即F( arr, L, R-1)

决策:由于是 后手选牌,自己 没有决定权, 对手一定会按照对自己最坏的情况进行选择,即 我们只能是上面两种情况的较小值,作为自己的分数

可以大致看一下下面这个简单的实例:

在开始看具体代码前,我们 必须要十分明确F(arr,L,R)方法和S(arr,L,R)方法的定义,这一点很重要!!!

F( arr, L, R),表示在[L,R]上,先手选择可以获得的最大分数
S( arr, L, R),表示在[L,R]上,后手选择可以获得的最大分数

在设计F( arr, L, R)时,会有 S( arr, L, R)的涉及,我们可以把他当做一个 黑盒,只需要明白他的作用,后面再写出他的方法体!

具体代码:

//这是主方法,我们先看下面的f方法和s方法,再回来看win方法public static int win(int[] arr) {//输入的无效数组if (arr==null || arr.length==0) {return 0;}//返回先手和后手选择中较大的分数return Math.max(f(arr, 0, arr.length-1), s(arr, 0, arr.length-1));}​//先手选择,在L~R上获得的最大分数public static int f(int[] arr, intL, intR) {//如果只剩一张牌,那么只能选这张牌if (L==R) {return arr[L];}​//从选左和选右中的较大值return Math.max(arr[L] +s(arr, L+1, R), arr[R] +s(arr, L, R-1));}​//后手选择,在L~R上获得的最大分数public static int s(int[] arr, intL, intR) {//如果只剩一张牌,由于是后手,所以没得选if (L==R) {return 0;}​    //当对方选完,变成你先手时,你只能选择对方留给你的较小值return Math.min(f(arr, L+1, R), f(arr, L, R-1));}

第一次写,写的不好或者有其他意见,你的都是对的

先后抽纸牌游戏 暴力递归相关推荐

  1. 暴力递归到动态规划 02 (绝顶聪明的人的纸牌游戏)

    1.题目 什么是绝顶聪明,比如有指派 50 100 20 10 ,绝顶聪明的人第一次手会选择10,则后手不管选哪个,这个先手都能取得100,最后取得最大总和,成为赢家 2. 暴力递归 递归终止条件,如 ...

  2. 用python实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)

    1.namedtuple:命名元组,可以创建一个没有方法只有属性的类 from collections import namedtuple card = namedtuple('card',['ran ...

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

    从一开始的暴力递归到傻瓜式的缓存动态规划到最终的动态规划 package day_16;/*** 给定一个整型数组arr,代表数值不同的纸牌排成一条线* 玩家A和玩家B依次拿走每张纸牌* 规定玩家A先 ...

  4. leetcode 55. Jump Game | 55. 跳跃游戏(暴力递归->傻缓存->DP)

    题目 https://leetcode.com/problems/jump-game/ 题解 又是经典套路,暴力递归->傻缓存->DP 没写草稿,直接看代码吧 class Solution ...

  5. leetcode 174. Dungeon Game | 174. 地下城游戏(暴力递归->傻缓存->dp)

    题目 https://leetcode.com/problems/dungeon-game/ 题解 方法1:4个参数的递归+缓存,TLE 今日结论:转换成dp之前,递归的参数设计很重要,参数越少越好 ...

  6. 腾讯校招笔试题之纸牌游戏

    题目 牛牛和羊羊正在玩一个纸牌游戏.这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai. 牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完. 他们的得分等 ...

  7. 腾讯 纸牌游戏 (排序)

    原文链接:https://www.nowcoder.com/test/10611931/summary [编程题] 纸牌游戏 时间限制:1秒 空间限制:32768K 牛牛和羊羊正在玩一个纸牌游戏.这个 ...

  8. 24点游戏的递归解法和Python实现

    24点游戏的递归解法和Python实现 目录 24点游戏的递归解法和Python实现 什么是24点游戏 递归思路 递归 24点问题的递归思路 Python代码实现 四则运算下无解的组合 总结 什么是2 ...

  9. uno牌的玩法图解_UNO优诺纸牌游戏玩法详解 这些经验不可多得

    UNO纸牌已经风靡全球数十年,被誉为是世界上最好玩的纸牌游戏,特点是简单易学,不用动什么脑筋,适合各年龄层人士玩.而在此游戏中最考验的是集中和反应,还有相互间的思维较量. 玩法规则 01 UNO游戏的 ...

最新文章

  1. vscode设置eslint检验无效_大整理!JavaScript开发者的27个神奇VSCode工具
  2. GeoServer 常见问题总结
  3. Metasploit+python生成免杀exe过360杀毒
  4. 1.10 instanceof关键字
  5. 使用ABAP Push Channel(APC)开发的乒乓球游戏,可双打
  6. 【目标检测】ATSS: bridging the gap between anchor-based and anchor-free detection via ATSS (cvpr20)
  7. 数据迁移测试_自动化数据迁移测试
  8. [转载] java中50个关键字以及各自用法大全
  9. Spring Boot Admin 的使⽤
  10. 京东商品信息及其价格爬虫
  11. 软件工程师如何自学成才?
  12. Django模糊查询
  13. 二叉树遍历(前中后序遍历代码及注释)
  14. VScode 历史版本
  15. UML 基本模型元素
  16. 搞懂朴素贝叶斯分类算法
  17. 修改java游戏分辨率怎么调_怎么修改jar游戏的分辨率
  18. 某小说App返回数据 解密分析
  19. LinkTrack UWB定位系统NLink协议解析方法
  20. 基于Spring boot框架开发的电商网站系统

热门文章

  1. ClipCursor与GetClipCursor
  2. 行为金融(九):投资者情绪
  3. 解决node.js-opensslErrorStack: [ ‘error:03000086:digital envelope routines::initialization error‘ ]错误
  4. Linux系统基础——程序和进程
  5. 不错的云沙箱检测工具
  6. Ceph存储搭建及在k8s中的使用
  7. AI行业精选日报_人工智能(12·27)
  8. day01-Web自动化测试进阶
  9. python threading中的join和setDaemon方法
  10. Matlab基础之坐标轴操作汇总(新加网格线设置)