当前位置: 首页 > news >正文

想要精通算法和SQL的成长之路 - 预测赢家

想要精通算法和SQL的成长之路 - 预测赢家

  • 前言
  • 一. 预测赢家
  • 二. 石子游戏(预测赢家的进阶版)
    • 2.1 博弈论

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 预测赢家

原题链接
在这里插入图片描述

主要思路:

  1. 我们定义dp[i][j]:在区间 [i, j] 之间先手情况下能拿到的相对分数
  2. 因为玩家1是先手,那么我们站在玩家1的角度来思考,在区间 [i, j] 之间,如果玩家1选择最左侧,值为num[i]。那么玩家2只能在[i-1,j]区间内选择,并且是先手。那么他能拿到的最大相对分数就是:dp[i+1][j]。那么此时玩家1选择左手时的相对分数就是:num[i] - dp[i+1][j]
  3. 同理如果玩家1先手选择最右侧,那么此时玩家1选择左手时的相对分数就是:num[j] - dp[i][j-1]
  4. 那么本次玩家1应该选择利益最大化的,即:Max(num[i] - dp[i+1][j], num[j] - dp[i][j-1])
  5. 只要这个值 >=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的成长之路 - 预测赢家 前言一. 预测赢家二. 石子游戏&#xff08;预测赢家的进阶版&#xff09;2.1 博弈论 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 预测赢家 原题链接 主要思路&#xff1a; 我们定义dp[i][j]&#xff1a;在区间 [i, j] 之间先…...

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V/0-10mA/0-20mA/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;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,测试&#xff1a; node -v npm -v2、利用Vue-cli来构建spa项目 2.1、什么是Vue-cli Vue CLI 是一个基于 Vue.js 的官方脚手架工具&#xff0c;用于自动生成vue.jswebpack的项目模板&#xff0c;它可以帮助开发者…...

Excel 通过条件格式自动添加边框

每录入一次数据就需要手动添加一次边框&#xff0c;非常麻烦&#xff0c;这不是我们想要的。 那么有没有办法&#xff0c;在我们录入数据后&#xff0c;自动帮我们加上边框呢&#xff1f; 选中要自动添加边框的列&#xff0c;然后按箭头流程操作 ↓ ↓ ↓ ↓...

mysql 备份和还原 mysqldump

因window系统为例 在mysql安装目录中的bin目录下 cmd 备份 备份一个数据库 mysqldump -uroot -h hostname -p 数据库名 > 备份的文件名.sql 备份部分表 mysqldump -uroot -h hostname -p 数据库名 [表 [表2…]] > 备份的文件名.sql ## 多个表 空格隔开&#xff0c;中间…...

ELK日志分析系统+ELFK(Filebeat)

本章结构&#xff1a; 1、ELK日志分析系统简介 2、Elasticsearch介绍&#xff08;简称ES&#xff09; 3、Logstash介绍 4、Kibana介绍 5、实验&#xff0c;ELK部署 一、ELK日志分析系统简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logst…...

ULID 在 Java 中的应用: 使用 `getMonotonicUlid` 生成唯一标识符

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

实用的嵌入式编码技巧:第三部分

每个触发器都有两个我们在风险方面违反的关键规格。“建立时间”是时钟到来之前输入数据必须稳定的最小纳秒数。“保持时间”告诉我们在时钟转换后保持数据存在多长时间。 这些规格因逻辑设备而异。有些可能需要数十纳秒的设置和/或保持时间&#xff1b;其他人则需要少一个数量…...

8个很棒的Vue开发技巧

1.路由参数解耦 通常在组件中使用路由参数&#xff0c;大多数人会做以下事情。 export default { methods: {getParamsId() {return this.$route.params.id} } } 在组件中使用 $route 会导致与其相应路由的高度耦合&#xff0c;通过将其限制为某些 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的数据库异构加速方案

随着新型硬件成本逐渐降低&#xff0c;充分利用新兴硬件资源提升数据库性能是未来数据库发展的重要方向之一&#xff0c;SIGMOD、VLDB、CICE数据库顶会上出现越来越多新兴硬件的论文和专题。在需求侧&#xff0c;随着数据量暴增和实时性的要求越来越高&#xff0c;数据库围绕处…...

哨兵模式(sentinel)

为什么需要哨兵模式 redis的主从复制模式能够缓解“读压力”&#xff0c;但是存在两个明显问题。 主节点发生故障&#xff0c;进行主节点切换的过程比较复杂&#xff0c;需要人工参与&#xff0c;导致故障恢复时间无法保障主节点通过主从复制模式将读压力分散出去&#xff0c…...

b站老王 自动驾驶决策规划学习记录(十二)

自动驾驶之速度规划详解&#xff1a;SL与ST迭代 上一讲&#xff1a;b站老王 自动驾驶决策规划学习记录&#xff08;十一&#xff09; 接着上一讲学习记录b站老王对自动驾驶规划系列的讲解 参考视频&#xff1a; 自动驾驶决策规划算法第二章第七节(上) 速度规划详解:SL与ST迭代…...

服务器租用机房机房的类型应该如何选择

服务器租用机房机房的类型应该如何选择 1.单电信机房 单电信服务器机房业务模式比较固定&#xff0c;访问量也不是很大&#xff0c;适合新闻类网站或政务类网站。如果网站的PV流量持续增加&#xff0c;建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题。 2.双线…...

大数据运维一些常见批量操作命令

大数据运维中&#xff0c;批量操作是一项常见的任务。在使用flume进行数据采集的过程中&#xff0c;有时会出现故障导致采集停止&#xff0c;此时积累了大量的文件。如果想要将这些文件迁移到新的目录&#xff0c;直接使用"mv"命令可能会因为文件数目过多而报错。为了…...

测试人职场生存必须避开的5个陷阱

在互联网职场的工作发展道路上&#xff0c;软件测试人员其实在公司中也面临着各种各样的职场陷阱&#xff0c;有些可能是因为项目业务不熟练造成的&#xff0c;有些可能是自身技术能力不足导致的...等等。软件测试入门相对来说比较容易些&#xff0c;但是想要在测试行业长久发展…...

力扣538 补9.18

538.把二叉搜索树转换为累加树 可以做&#xff0c;主要还是分类讨论并找规律。 当前结点如果是左节点的话&#xff0c;root.valroot.valpre.valdfs(root.right); 如果是右结点的话&#xff0c; root.valpre.val-preval-dfs(root.left); 都和前一个结点有关系&#xff0c;如…...

[Linux入门]---Linux编译器gcc/g++使用

文章目录 1.背景知识2.gcc如何完成编译运行工作预处理&#xff08;进行宏替换&#xff09;编译&#xff08;生成汇编&#xff09;汇编&#xff08;生成机器可识别代码&#xff09;链接&#xff08;生成可执行文件&#xff09; 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代码托管和研发协作的国内平台&#xff0c;在上面可以托管个人或公司代…...

Logback彩色日志进阶玩法:自定义颜色规则、区分环境开关,以及文件日志的‘去色’指南

Logback彩色日志进阶实战&#xff1a;从炫彩控制台到严谨生产环境的全链路配置 在软件开发的生命周期中&#xff0c;日志是我们最忠实的伙伴。想象一下深夜调试时&#xff0c;满屏灰白的日志中突然跳出一行醒目的红色ERROR信息——这就是彩色日志赋予我们的"视觉直觉"…...

LabVIEW多核并行编程实战:从数据流原理到生产者-消费者架构优化

1. 项目概述&#xff1a;从单核到多核的性能跃迁如果你用LabVIEW做过一些稍微复杂的应用&#xff0c;比如高速数据采集、实时图像处理或者复杂的控制算法仿真&#xff0c;大概率会遇到一个瓶颈&#xff1a;程序跑起来感觉“卡”&#xff0c;CPU占用率明明不高&#xff0c;但循环…...

AnyKernel3:Android内核刷机终极指南 - 5分钟构建通用刷机包

AnyKernel3&#xff1a;Android内核刷机终极指南 - 5分钟构建通用刷机包 【免费下载链接】AnyKernel3 AnyKernel, Evolved 项目地址: https://gitcode.com/gh_mirrors/an/AnyKernel3 在Android设备定制化领域&#xff0c;内核刷机是提升性能、扩展功能的关键步骤。AnyKe…...

Cursor Pro免费激活终极指南:简单快速解锁AI编程高级功能

Cursor Pro免费激活终极指南&#xff1a;简单快速解锁AI编程高级功能 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your …...

Perplexity社会新闻搜索响应延迟突增47%?独家披露其底层新闻图谱更新机制与3类高危缓存失效场景

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity社会新闻搜索响应延迟突增47%&#xff1f;独家披露其底层新闻图谱更新机制与3类高危缓存失效场景 Perplexity 社会新闻搜索服务近期观测到 P95 响应延迟从 320ms 飙升至 468ms&#xff0c;增幅达 4…...

git讲解,git vscode 对应,git pycharm 对应

文章目录安装git配置git什么是git 仓库创建版本库git addvscodegit statusgit addgit statuspycharm变更列表视图如果创建文件的时候选择了添加到git版本控制暂存区域视图时光穿梭机版本回退修改文件vscodepycharm变更列表暂存区域git logvscodepycharmgit reset 版本回退git r…...

别再混着用了!C++里malloc、new和vector到底该怎么选?一个真实项目踩坑复盘

别再混着用了&#xff01;C里malloc、new和vector到底该怎么选&#xff1f;一个真实项目踩坑复盘 在开发一个高性能数据缓存管理器时&#xff0c;团队新成员提交的代码引发了持续三天的内存泄漏排查。同一个功能模块中竟同时出现了malloc、new和vector三种内存管理方式&#xf…...

服务号版本:weixin-java-mp=4.8.3.B,spring-boot=3.3.1,httpclient5=5.5.2

文章目录 引言 I 微信绑定服务号 II 推荐使用成熟 SDK 基于微信code登录:前端先调用loginByWxCode接口 解绑 依赖版本冲突 III httpclient5版本问题 问题 分析 解决方案: 强制锁定 HttpClient 5.5.2 IV httpcore5版本冲突问题 问题 分析 解决方案 引言 本文介绍了微信开发中…...

LAMMPS模拟聚乙烯拉伸:从in文件参数设置到应力-应变曲线绘制的完整避坑指南

LAMMPS模拟聚乙烯拉伸&#xff1a;从参数优化到数据分析的全流程实战 聚乙烯作为最常见的聚合物材料之一&#xff0c;其力学性能研究对工业应用具有重要意义。分子动力学模拟能够从微观角度揭示聚乙烯在拉伸过程中的结构演变和力学响应&#xff0c;而LAMMPS作为一款开源的分子…...

纯音乐制作难题,智能创作轻松化解

前言&#xff1a;音乐人的创作困境&#xff0c;真的太戳心了 你有没有过这样的时刻&#xff1f;脑子里突然冒出一段超有感觉的旋律&#xff0c;想把它做成完整纯音乐&#xff0c;却被现实难题卡住&#xff1a;不懂编曲&#xff0c;不知道怎么搭配乐器&#xff1b;不会用专业软…...