简单博弈(java)
最近在看左神视频学习算法,记录下比较难懂的有趣的部分
地址: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)相关推荐
- 编写运行最简单的java程序——使用记事本编写java程序
编写运行最简单的java程序--使用记事本编写java程序 第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还 ...
- 用java做一个简单记事本_用记事本写一个简单的java程序
用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...
- Intellij Idea创建一个简单的java项目
2016年11月12日 我即将要离开象牙塔(校园),踏入社会,想想未来我是某个公司的一个程序员,再对比一下小时的梦想,好像出入挺大的.今天我不得不为即将的工作准备,一个java开发工程师,但是我现在是 ...
- 一个简单的Java web服务器实现
前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...
- java的同步关键字_简单了解Java synchronized关键字同步
简单了解Java synchronized关键字同步 发布于 2021-1-13| 复制链接 摘记: synchronized synchronized可以用来同步块,同步方法.同步块可以用来更精确 ...
- HDU 1564 简单博弈 水
n*n棋盘,初始左上角有一个石头,每次放只能在相邻的四个位置之一,不能操作者输. 如果以初始石头编号为1作为后手,那么对于每次先手胜的情况其最后一步的四周的编号必定是奇数,且此时编号为偶数,而对于一个 ...
- 一个简单的Java计时器项目,附源码
学Java开发的小伙伴都会想着做一些项目来检验自己的学习成果,今天小千就来分享一个简单的Java计时器项目,源码也放在文中,大家可以参考一下. Java计时器项目 开发环境:win8+eclipse+ ...
- 超简单的java爬虫
最简单的爬虫,不需要设定代理服务器,不需要设定cookie,不需要http连接池,使用httpget方法,只是为了获取html代码... 好吧,满足这个要求的爬虫应该是最基本的爬虫了.当然这也是做复杂 ...
- HDU - 5978 To begin or not to begin(简单博弈)
题目链接:点击查看 题目大意:给出k个黑球以及一个红球,两个人轮流摸球,摸到红球算赢,问先手有优势还是后手有优势还是都一样,若先手优势输出1,若后手优势输出2,若都一样输出0 题目分析:简单博弈,我们 ...
- java最少有多少线程_【并发编程】一个最简单的Java程序有多少线程?
一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...
最新文章
- php5.3.28安装,安装php-5.3.28 时问题
- 空间映射网络--Spatial Transformer Networks
- 如何设置putty远程登录linux
- mybaits二十五:mybatis整合ehcache
- 调用python_「Python 进阶」python 实现链式调用
- elk收集nginx日志
- 程序员的进化(目前还看不懂)
- Linux文件默认权限和umask笔记
- Python 中文Key 报错问题
- python导入模块的方式错误的是,导入模块时的错误处理
- VMware终端用户计算的战略和愿景
- Java 12字符串方法
- NNACL2021 放榜啦~
- 怎么把java安装到64位_怎么安装64位JAVA,大师来详解
- 聊聊外贸企业自建网站注意事项
- Windows系统怎么换硬盘图标
- ESP8266模块搭建最小系统原理图
- 三星S3 939/9300 android 4.3 如何打开开发者模式
- explain是mysql的关键字吗_mysql 中的explain关键字
- 地税计算机发展,当前我省地税信息化数据应用的现实状况和发展趋势
热门文章
- 在linux中PHP的集成环境吗,linux有php集成环境吗
- python股票查询系统_使用Python查询股票所属行业
- 基坑计算理论m法弹性支点法_建筑基坑支护考题汇总.doc
- python哪些模板引擎比较_3 个 Python 模板库比较
- 关于蓝桥杯的经验(本人java B 国二)
- 【预测模型】基于粒子群算法优化最小二乘支持向量机lssvm实现预测附matlab源码
- java 前后端分离思想与实现
- wifi控制基于STM32与NFC的万能红外遥控器—毕业设计(1)
- schema自动生成前端代码
- Flask Swagger 文档自动生成