想要精通算法和SQL的成长之路 - 预测赢家
想要精通算法和SQL的成长之路 - 预测赢家
- 前言
- 一. 预测赢家
- 二. 石子游戏(预测赢家的进阶版)
- 2.1 博弈论
前言
想要精通算法和SQL的成长之路 - 系列导航
一. 预测赢家
原题链接
主要思路:
- 我们定义
dp[i][j]
:在区间[i, j]
之间先手情况下能拿到的相对分数。 - 因为玩家1是先手,那么我们站在玩家1的角度来思考,在区间
[i, j]
之间,如果玩家1选择最左侧,值为num[i]
。那么玩家2只能在[i-1,j]
区间内选择,并且是先手。那么他能拿到的最大相对分数就是:dp[i+1][j]
。那么此时玩家1选择左手时的相对分数就是:num[i] - dp[i+1][j]
。 - 同理如果玩家1先手选择最右侧,那么此时玩家1选择左手时的相对分数就是:
num[j] - dp[i][j-1]
。 - 那么本次玩家1应该选择利益最大化的,即:
Max(num[i] - dp[i+1][j], num[j] - dp[i][j-1])
。 - 只要这个值 >=0 (相对分数,差值)玩家1就是胜利者。
代码如下:
public boolean predictTheWinner(int[] nums) {return dfs(0, nums.length - 1, nums) >= 0;
}public int dfs(int left, int right, int[] nums) {// 遍历完了,返回0if (left > right) {return 0;}// 选择最左侧时的最大相对差值int chooseLeft = nums[left] - dfs(left + 1, right, nums);// 选择最右侧时的最大相对差值int chooseRight = nums[right] - dfs(left, right - 1, nums);// 返回最大相对差值return Math.max(chooseLeft, chooseRight);
}
当然,这类递归性质的代码,往往都存在一些重复计算的动作,我们用一个全局的数组,来记录递归过程中计算出来的值,即:记忆化搜索。
private int[][] memo;public boolean predictTheWinner(int[] nums) {int len = nums.length;memo = new int[len][len];// 初始化一个比较特殊的值,用于判断是否计算过for (int i = 0; i < len; i++) {Arrays.fill(memo[i], Integer.MAX_VALUE);}return dfs(0, nums.length - 1, nums) >= 0;
}public int dfs(int left, int right, int[] nums) {if (left > right) {return 0;}// 记忆化搜索,如果搜索过,直接返回if(memo[left][right] != Integer.MAX_VALUE) {return memo[left][right];}// 如果当前先手,选择左边的数,那么后手就是:dfs(left + 1, right, nums),计算后手的最大值,我们求此时先后手的相对值int chooseLeft = nums[left] - dfs(left + 1, right, nums);int chooseRight = nums[right] - dfs(left, right - 1, nums);return memo[left][right] = Math.max(chooseLeft, chooseRight);
}
二. 石子游戏(预测赢家的进阶版)
原题链接
这个题目相当于在第一题的基础上多了两个条件:
- 石头总数为奇数。
- 堆数为偶数。
也就是说不可能存在平局的情况。
2.1 博弈论
在满足上述两个条件的基础上:先手必胜。
我们假设一个数组如下:[奇, 偶, 奇, 偶, 奇, 偶, 奇, 偶, 奇, 偶, 奇, 偶]。
- 那么对于先手而言:他能选择的序列为:奇偶序列(头和尾)[
奇
, 偶, 奇, 偶, 奇, 偶, 奇, 偶, 奇, 偶, 奇,偶
]。 - 那么对于后手而言:如果先手选择的是奇数,那么后手选择的序列只能是偶偶序列。[“先手选的”,
偶
, 奇, 偶, 奇, 偶, 奇, 偶, 奇, 偶, 奇,偶
]。反之同理,只能选择奇奇序列。
总之就是:先手必定是奇偶性不同的局面。后手必定是奇偶性相同的局面。
那么问题简单了,我们只需要知道,奇序列的总和 和 偶序列总和 谁大,然后先手每次决策的时候,限制对方只能选择奇偶序列的对立面即可。
因此题目中既然说明了Alice
先手的情况,我们直接返回true
就完事了。
public boolean stoneGame(int[] piles) {return true;
}
相关文章:
想要精通算法和SQL的成长之路 - 预测赢家
想要精通算法和SQL的成长之路 - 预测赢家 前言一. 预测赢家二. 石子游戏(预测赢家的进阶版)2.1 博弈论 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 预测赢家 原题链接 主要思路: 我们定义dp[i][j]:在区间 [i, j] 之间先…...
高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V/0-10mA/0-20mA/4-20mA
主要特性: >>精度等级:0.1级。产品出厂前已检验校正,用户可以直接使用 >>辅助电源:8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号:0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…...
Vue路由和Node.js环境搭建
文章目录 一、vue路由1.1 简介1.2 SPA1.3 实例 二、Node.js环境搭建2.1 Node.js简介2.2 npm2.3 环境搭建2.3.1 下载解压2.3.2 配置环境变量2.3.3 配置npm全局模块路径和cache默认安装位置2.3.4 修改npm镜像提高下载速度 2.4 运行项目 一、vue路由 1.1 简介 Vue 路由是 Vue.js…...
【Vue】使用vue-cli搭建SPA项目的路由,嵌套路由
一、SPA项目的构建 1、前期准备 我们的前期的准备是搭建好Node.js,测试: node -v npm -v2、利用Vue-cli来构建spa项目 2.1、什么是Vue-cli Vue CLI 是一个基于 Vue.js 的官方脚手架工具,用于自动生成vue.jswebpack的项目模板,它可以帮助开发者…...
Excel 通过条件格式自动添加边框
每录入一次数据就需要手动添加一次边框,非常麻烦,这不是我们想要的。 那么有没有办法,在我们录入数据后,自动帮我们加上边框呢? 选中要自动添加边框的列,然后按箭头流程操作 ↓ ↓ ↓ ↓...
mysql 备份和还原 mysqldump
因window系统为例 在mysql安装目录中的bin目录下 cmd 备份 备份一个数据库 mysqldump -uroot -h hostname -p 数据库名 > 备份的文件名.sql 备份部分表 mysqldump -uroot -h hostname -p 数据库名 [表 [表2…]] > 备份的文件名.sql ## 多个表 空格隔开,中间…...
ELK日志分析系统+ELFK(Filebeat)
本章结构: 1、ELK日志分析系统简介 2、Elasticsearch介绍(简称ES) 3、Logstash介绍 4、Kibana介绍 5、实验,ELK部署 一、ELK日志分析系统简介 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logst…...
ULID 在 Java 中的应用: 使用 `getMonotonicUlid` 生成唯一标识符
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
实用的嵌入式编码技巧:第三部分
每个触发器都有两个我们在风险方面违反的关键规格。“建立时间”是时钟到来之前输入数据必须稳定的最小纳秒数。“保持时间”告诉我们在时钟转换后保持数据存在多长时间。 这些规格因逻辑设备而异。有些可能需要数十纳秒的设置和/或保持时间;其他人则需要少一个数量…...
8个很棒的Vue开发技巧
1.路由参数解耦 通常在组件中使用路由参数,大多数人会做以下事情。 export default { methods: {getParamsId() {return this.$route.params.id} } } 在组件中使用 $route 会导致与其相应路由的高度耦合,通过将其限制为某些 URL 来限制组件的灵活性。…...
Python - 小玩意 - 文字转语音
import pyttsx3 from tkinter import *def recognize_and_save():try:say pyttsx3.init()rate say.getProperty(rate) # 获取当前语速属性的值say.setProperty(rate, rate - 20) # 设置语速属性为当前语速减20text text_var.get()# 语音识别say.say(text)say.runAndWait()…...
聚焦数据库和新兴硬件的技术合力 中科驭数受邀分享基于DPU的数据库异构加速方案
随着新型硬件成本逐渐降低,充分利用新兴硬件资源提升数据库性能是未来数据库发展的重要方向之一,SIGMOD、VLDB、CICE数据库顶会上出现越来越多新兴硬件的论文和专题。在需求侧,随着数据量暴增和实时性的要求越来越高,数据库围绕处…...
哨兵模式(sentinel)
为什么需要哨兵模式 redis的主从复制模式能够缓解“读压力”,但是存在两个明显问题。 主节点发生故障,进行主节点切换的过程比较复杂,需要人工参与,导致故障恢复时间无法保障主节点通过主从复制模式将读压力分散出去,…...
b站老王 自动驾驶决策规划学习记录(十二)
自动驾驶之速度规划详解:SL与ST迭代 上一讲:b站老王 自动驾驶决策规划学习记录(十一) 接着上一讲学习记录b站老王对自动驾驶规划系列的讲解 参考视频: 自动驾驶决策规划算法第二章第七节(上) 速度规划详解:SL与ST迭代…...
服务器租用机房机房的类型应该如何选择
服务器租用机房机房的类型应该如何选择 1.单电信机房 单电信服务器机房业务模式比较固定,访问量也不是很大,适合新闻类网站或政务类网站。如果网站的PV流量持续增加,建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题。 2.双线…...
大数据运维一些常见批量操作命令
大数据运维中,批量操作是一项常见的任务。在使用flume进行数据采集的过程中,有时会出现故障导致采集停止,此时积累了大量的文件。如果想要将这些文件迁移到新的目录,直接使用"mv"命令可能会因为文件数目过多而报错。为了…...
测试人职场生存必须避开的5个陷阱
在互联网职场的工作发展道路上,软件测试人员其实在公司中也面临着各种各样的职场陷阱,有些可能是因为项目业务不熟练造成的,有些可能是自身技术能力不足导致的...等等。软件测试入门相对来说比较容易些,但是想要在测试行业长久发展…...
力扣538 补9.18
538.把二叉搜索树转换为累加树 可以做,主要还是分类讨论并找规律。 当前结点如果是左节点的话,root.valroot.valpre.valdfs(root.right); 如果是右结点的话, root.valpre.val-preval-dfs(root.left); 都和前一个结点有关系,如…...
[Linux入门]---Linux编译器gcc/g++使用
文章目录 1.背景知识2.gcc如何完成编译运行工作预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)链接(生成可执行文件) 3.函数库动态库静态库动静态库的区别 4.gcc选项 1.…...
[Git入门]---gitee注册及代码提交
文章目录 1.Gitee是什么2.gitee注册3.git工具及图形化界面工具安装4.gitee仓库创建5.进行本地仓库与远端gitee仓库的链接6.git三板斧addcommitpush 7.gitee提交代码常见问题 1.Gitee是什么 gitee是基于git代码托管和研发协作的国内平台,在上面可以托管个人或公司代…...
企业架构LNMP学习笔记46
PHP测试连接代码: php代码测试使用memcached: 示例代码: <?php //实例化类 $mem new memcached(); //调用连接memcached方法 注意连接地址和端口号 $mem->addServer(192.168.17.114,11211); //存数据 var_dump($mem->set(name,l…...
ELFK之zookeeper+kafka
目录 kafkazookeeper的系统架构 Zookeeper 一、zookeeper概述 二、zookeeper特点 三、zookeeper选举机制 四、应用场景 五、zookeeper实验实例 Kafka 一、概述 为什么需要消息队列(MQ) 使用消息队列的好处 消息队列的两种模式 Kafka 定义 二、Kafka 的特性 三、Ka…...
ECharts
ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的…...
jsoup框架技术文档--java爬虫--架构体系
阿丹: 在学习以及认知使用一个新技术之前一定要搞清楚有关框架的架构体系。了解一下该技术的底层会对后面编写代码以及寻找报错都是很有用处的,前期做的铺垫多一点,后期开发的时候就很方便。 jsoup框架的关键组件 JSoup框架的关键组件主要包…...
OpenStack创建云主机并连接CRT
文章目录 OpenStackT版创建云主机并连接CRT命令行操作(1)创建镜像(2)创建实例(3)创建网络创建内网创建外网 (4)创建安全组(5)创建路由(6ÿ…...
linux-sed命令
目录 1.linux-shell sed获取某一段字符串 2.linux-shell shell脚本中 sed -n取出某一行赋给一个变量 3.linux-shell sed查询某一行 1.linux-shell sed获取某一段字符串 如果要获取的是某一段字符串,可以在 sed 命令中使用正则表达式来指定需要获取的字符串。例如…...
Elasticsearch:什么是向量和向量存储数据库,我们为什么关心?
Elasticsearch 从 7.3 版本开始支持向量搜索。从 8.0 开始支持带有 HNSW 的 ANN 向量搜索。目前 Elasticsearch 已经是全球下载量最多的向量数据库。它允许使用密集向量和向量比较来搜索文档。 矢量搜索在人工智能和机器学习领域有许多重要的应用。 有效存储和检索向量的数据库…...
JOSEF约瑟 剩余电流继电器PFR-5 PFE-W-20 国产化改造ZLR-G81 ZCT-45
系列型号: PFR-003剩余电流继电器 PFR-03剩余电流继电器 PFR-5剩余电流继电器 PFR-W-105互感器 PFR-W-140互感器 PFR-W-20互感器 PFR-W-210互感器 PFR-W-30互感器 PFR-W-35互感器 PFR-W-70互感器 一、用途 PFR剩余电流继电器(以下简称继电器…...
分别用Python和Go实现对文件夹及其子文件夹里的文件进行批量重命名
文章目录 问题阐述上代码结果如何 问题阐述 最近在继续提高自己的go技术时,从网上一些平台获取到了一些学习资料,然后下载到本地后,文件的命名是真的像衣托答辩: 除了上述的文件,还有一mol多神奇的命名,害…...
redis深度历险 千帆竞发 —— 分布式锁
分布式应用进行逻辑处理时经常会遇到并发问题。 比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个…...
淘宝客赚钱网站/网络策划方案
LOCAL是定义局部变量用的.用这个关键字是为了让编译器给变量分配内存. 格式是: LOCAL 变量名:变量类型如: wc:WNDCLASSEX ;定义一个变量名字是wc,类型是窗体类, meg:MSG ;定义一个变量名字是meg,类型是消息变量...
关于做公司官方网站域名申请/制作网页完整步骤代码
下面是育路教育网编辑整理2011年计算机基础知识精选部分及答案,供大家参考一下。祝愿所有考生考试顺利!1.世界上第一台电子计算机诞生于 ( B)A. 1941年B. 1946年C. 1949年D. 1950年2. 世界上首次提出存储程…...
html5黑色网站/百度小说app下载
无线传屏技术—— Android 下的Miracast 实现 AirPlayAirPlay 是苹果开发的一致无线技术,可以通过Wi-FiI 将iPhone、iPad、iPodTouch 等iOS设备上的包括图片、音频、视频通过无线的方式传输到支持AirPlay 设备。AirPlay 具备DLNA 所没有的镜像功能(AirPlay 镜像)&…...
网站平台建设所需开发工具/汕头网站推广
HBase的分页实现相对复杂一些。核心思想是结合分页过滤器PageFilter(pageSize)和查询设置开始行scan.setStartRow(lastRow),lastRow为上一次查询rowkey,需要注意的是该rowkey是一个数组,对应多字段的存储位置;不同用户登录会产生不同lastRow&…...
哪个网站做螺丝生意好/陕西网站推广公司
本文以初学身份对比RequireJS和jQuery来说明前者的优点,若使用其它库,可以“眼动”将jQuery替换为你所用的js库; “模块化”,实现某一功能的方法独立化,使其可以复用;这一高大上的名词,按我的理…...
泛微 企业网站建设计划/sns营销
欢迎喜欢实施运维及数据的小伙伴加入群进行谈论! 运维技术群:263859509 lvs 原理 LVS通过工作于内核的ipvs模块来实现功能,其主要工作于netfilter 的INPUT链上。 而用户需要对ipvs进行操作配置则需要使用ipvsadm这个工具。 ipvsadm主要用于设…...