最近在看左神视频学习算法,记录下比较难懂的有趣的部分

地址:https://www.bilibili.com/video/BV1kQ4y1h7ok?p=10

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

输入:1,2,100,4
输出:101

题目意思是说玩家A和玩家B都做最优决策,最后返回最大分数。

关于这部分看到好多用到记忆化搜索和动态规划的方法,确实比较难懂,本人在这里也只能对照左神的视频谈谈自己的理解,使用暴力法

从示例输入来看,明牌方式简单分析A,B玩家的博弈心理:

只能从两端取,显然,A只能取1或4,A若取1,B只能取2或4,最后大头100只能拱手相让,A必胜,反过来,A若取4,下一步B必取100,接下来无论如何都是B胜。

从这里来看,这个决策由两部分组成,A先和B后,我们不妨去创建两个方法去模拟A和B的最佳取数的过程

    public static int A(int[]arr,int l,int r){if(l == r){  // 如果只有一个待取数了,直接加到上一步总数上return arr[l];}return Math.max(arr[l]+B取最优值后A的最优取值,arr[r]+B取最优值后A的最优取值);  //暴力取法,返回在这一步两端取值情况下的A的最大分数}

此时关键是:B取最优值后A的最优取值,这个是关键。

  public static int B(int[]arr,int l,int r){if(l == r){ //站在A的角度,最后一个值被B取得,返回0return 0;}return Math.min(f(arr,l+1,r),f(arr,l,r-1));  //此时B若取l值,A就是在l+1到r上做最优取值,//此时B若取r值,A就是在l到r-1上做最优取值//此时为啥是取两者最小}

为啥是两者最小??

其实题目中说了A和B都是聪明绝顶的人,故此时B会拿到他的最优取值,故A只能在拿左或拿右中拿到最小的最优取值,A是被B局限的情况下取得最优值

故此时总结构代码为:

public class BoYiLunDemo {public static int A(int[]arr,int l,int r){if(l == r){return arr[l];}return Math.max(arr[l]+B(arr,l+1,r),arr[r]+B(arr,l,r-1));}public static int B(int[]arr,int l,int r){if(l == r){return 0;}return Math.min(A(arr,l+1,r),A(arr,l,r-1));}public static void main(String[] args) {int[] arr = {1,2,100,4};int size = arr.length;System.out.println(Math.max(A(arr,0,size-1),B(arr,0,size-1)));}
}

打完收工:

简单博弈(java)相关推荐

  1. 编写运行最简单的java程序——使用记事本编写java程序

    编写运行最简单的java程序--使用记事本编写java程序 第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还 ...

  2. 用java做一个简单记事本_用记事本写一个简单的java程序

    用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...

  3. Intellij Idea创建一个简单的java项目

    2016年11月12日 我即将要离开象牙塔(校园),踏入社会,想想未来我是某个公司的一个程序员,再对比一下小时的梦想,好像出入挺大的.今天我不得不为即将的工作准备,一个java开发工程师,但是我现在是 ...

  4. 一个简单的Java web服务器实现

    前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...

  5. java的同步关键字_简单了解Java synchronized关键字同步

    简单了解Java synchronized关键字同步 发布于 2021-1-13| 复制链接 摘记:  synchronized synchronized可以用来同步块,同步方法.同步块可以用来更精确 ...

  6. HDU 1564 简单博弈 水

    n*n棋盘,初始左上角有一个石头,每次放只能在相邻的四个位置之一,不能操作者输. 如果以初始石头编号为1作为后手,那么对于每次先手胜的情况其最后一步的四周的编号必定是奇数,且此时编号为偶数,而对于一个 ...

  7. 一个简单的Java计时器项目,附源码

    学Java开发的小伙伴都会想着做一些项目来检验自己的学习成果,今天小千就来分享一个简单的Java计时器项目,源码也放在文中,大家可以参考一下. Java计时器项目 开发环境:win8+eclipse+ ...

  8. 超简单的java爬虫

    最简单的爬虫,不需要设定代理服务器,不需要设定cookie,不需要http连接池,使用httpget方法,只是为了获取html代码... 好吧,满足这个要求的爬虫应该是最基本的爬虫了.当然这也是做复杂 ...

  9. HDU - 5978 To begin or not to begin(简单博弈)

    题目链接:点击查看 题目大意:给出k个黑球以及一个红球,两个人轮流摸球,摸到红球算赢,问先手有优势还是后手有优势还是都一样,若先手优势输出1,若后手优势输出2,若都一样输出0 题目分析:简单博弈,我们 ...

  10. java最少有多少线程_【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

最新文章

  1. php5.3.28安装,安装php-5.3.28 时问题
  2. 空间映射网络--Spatial Transformer Networks
  3. 如何设置putty远程登录linux
  4. mybaits二十五:mybatis整合ehcache
  5. 调用python_「Python 进阶」python 实现链式调用
  6. elk收集nginx日志
  7. 程序员的进化(目前还看不懂)
  8. Linux文件默认权限和umask笔记
  9. Python 中文Key 报错问题
  10. python导入模块的方式错误的是,导入模块时的错误处理
  11. VMware终端用户计算的战略和愿景
  12. Java 12字符串方法
  13. NNACL2021 放榜啦~
  14. 怎么把java安装到64位_怎么安装64位JAVA,大师来详解
  15. 聊聊外贸企业自建网站注意事项
  16. Windows系统怎么换硬盘图标
  17. ESP8266模块搭建最小系统原理图
  18. 三星S3 939/9300 android 4.3 如何打开开发者模式
  19. explain是mysql的关键字吗_mysql 中的explain关键字
  20. 地税计算机发展,当前我省地税信息化数据应用的现实状况和发展趋势

热门文章

  1. 在linux中PHP的集成环境吗,linux有php集成环境吗
  2. python股票查询系统_使用Python查询股票所属行业
  3. 基坑计算理论m法弹性支点法_建筑基坑支护考题汇总.doc
  4. python哪些模板引擎比较_3 个 Python 模板库比较
  5. 关于蓝桥杯的经验(本人java B 国二)
  6. 【预测模型】基于粒子群算法优化最小二乘支持向量机lssvm实现预测附matlab源码
  7. java 前后端分离思想与实现
  8. wifi控制基于STM32与NFC的万能红外遥控器—毕业设计(1)
  9. schema自动生成前端代码
  10. Flask Swagger 文档自动生成