预测赢家00

news2024/9/27 21:20:07

题目链接

预测赢家

题目描述

注意点

  • 1 <= nums.length <= 20
  • 0 <= nums[i] <= 10^7
  • 假设每个玩家的玩法都会使他的分数最大化
  • 如果两个玩家得分相等,同样认为玩家1是游戏的赢家

解答思路

  • 需要注意的是,如果数组中的元素个数为偶数,则玩家1始终都是游戏的赢家
  • 首先可以使用递归找到各个区间能获得的最大分数,因为本题是要判断两个玩家都保证分数最大化的情况下玩家1的分数是否不比玩家2的分数低,所以递归时无论选择左侧数字还是右侧数字都应该减去下一次递归的最大值,最终dfs(nums, dp, 0, n - 1)返回的值就是都保证分数最大化时玩家1与玩家2的分数差。因为在递归的过程中各个区间的最大值可能有多次计算,所以可以使用dp数组保存区间内的最大分数,也就是记忆化递归
  • 第二个方法则是动态规划,首先直到的是区间[i, i]对应的dp[i][i] = nums[i],可以根据dp[i][j - 1]或dp[i + 1][j]对应的dp[i][j]的值,可从区间大小0推至n - 1对应的dp值,需要注意的是,推导dp的公式为dp[i][j] = Math.max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]),无论选择左侧数字还是右侧数字仍然应该减去下一次递归的最大值(下一次轮到对手选择下一轮的最大值),最终根据dp[0][n - 1]的值是否不小于0判断玩家1是否是赢家

代码

方法一:

class Solution {
    public boolean predictTheWinner(int[] nums) {
        int n = nums.length;
        if (n % 2 == 0) {
            return true;
        }
        // dp[i][j]表示[i, j]区间内能获得的最大分数
        int[][] dp = new int[n][n];
        return dfs(nums, dp, 0, n - 1) >= 0;
    }

    public int dfs(int[] nums, int[][] dp, int left, int right) {
        if (left > right) {
            return 0;
        }
        if (dp[left][right] != 0) {
            return dp[left][right];
        }
        int leftVal = nums[left] - dfs(nums, dp, left + 1, right);
        int rightVal = nums[right] - dfs(nums, dp, left, right - 1);
        return Math.max(leftVal, rightVal);
    }
}

方法二:

class Solution {
    public boolean predictTheWinner(int[] nums) {
        int n = nums.length;
        if (n % 2 == 0) {
            return true;
        }
        // dp[i][j]表示[i, j]区间内能获得的最大分数
        int[][] dp = new int[n][n];
        for (int i = 0; i < n; i++) {
            dp[i][i] = nums[i];
        }
        for (int len = 1; len < n; len++) {
            for (int i = 0; i + len < n; i++) {
                int j = i + len;
                dp[i][j] = Math.max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]);
            }
        }
        return dp[0][n - 1] >= 0;
    }
}

关键点

  • 玩家1与玩家2的最终分数总和之差决定了谁是赢家
  • 无论是记忆化递归还是动态规划dp所记录的始终是玩家1与玩家2的总分数之差
  • 动态规划的思想

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang环境安装、配置详细

Windows下安装Go开发环境 点我下载 Windows配置Go环境变量 出现工具install失败时&#xff0c;切换其它代理 # 1. 七牛 CDN go env -w GOPROXYhttps://goproxy.cn,direct# 2. 阿里云 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct# 3. 官方 go env -w GOP…

波场(Tron)监听区块交易(TRX,USDT)

前言说明&#xff1a; 本篇文章参考GitHub一位伙伴的代码&#xff0c;再代码基础上优化改良以后的结果&#xff0c;但是一下找不到那位大佬的GitHub链接了&#xff0c;如有侵权请联系作者调整文章&#xff0c;让跟多人收益。谢谢。 实现思路: 波场链是一条很新奇的链&#xff…

网络协议--HTTP 和 HTTPS 的区别

网络协议–HTTP 和 HTTPS 的区别 一、简述 HTTP (全称 Hyper Text Transfer Protocol)&#xff0c;就是超文本传输协议&#xff0c;用来在 Internet 上传送超文本。是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和应答的标准(TCP)&#xff0c…

NET 8 + WPF 企业级工作流系统

目录 前言 项目介绍 功能模块 快速预览 1、快速预览方式1 2、快速预览方式2 3、快速预览方式3 项目框架 项目功能 1、快速代码生成 2、大屏界面&#xff08;可拖拽&#xff0c;可全屏&#xff09; 3、Form 表单 4、通用crud方法 5、大文件上传与下载 6、多窗口、…

【机器学习】集成学习的基本概念、Bagging和Boosting的区别以及集成学习方法在python中的运用(含python代码)

引言 集成学习是一种机器学习方法&#xff0c;它通过结合多个基本模型&#xff08;通常称为“弱学习器”&#xff09;来构建一个更加强大或更可靠的模型&#xff08;“强学习器”&#xff09; 文章目录 引言一、集成学习1.1 集成学习的核心思想1.2 常见的集成学习方法1.2.1 Bag…

SpringBoot3 + Spring Security6认证授权

SpringBoot3 Spring Security6 实现默认地址/login的认证 Spring Security 核心技术过滤器。一个web请求会经过一系列的过滤器进行认证授权。 主要是用默认的/login请求&#xff0c;继承UsernamePasswordAuthenticationFilter&#xff0c;来实现用户名和密码登录。 核心流程 …

idea一键自动化部署项目

文章目录 前言一、 IDEA插件安装1. 首先下载 Alibaba Cloud Toolkit 插件2. 插件下载完成后重启IDEA 二、SpringBoot项目准备1. pom.xml 文件2. controller3. 启动类 三、SpringBoot项目jar包部署1. Alibaba Cloud Toolkit 插件服务器配置2. 主机 IP、用户名、密码 点击测试链接…

5月,我面试60多号人,才发现很多人没有这项能力

很多 3~5 年开发经验的&#xff0c;都来自传统行业&#xff0c;所接触的都是一些非常传统的项目&#xff0c;像上面的一些案例场景&#xff0c;根本没碰到过&#xff0c;也不知道如何找到好的解决方案。 交流的过程中&#xff0c;发现这些很基本的问题&#xff0c;他们普遍都答…

Storm计算框架

工作流程 主要组件 streams spouts Bolt Tuple Topology stream grouping

Rust多线程编程概述

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust到底值不值得学&#xff0c;之一 -CSDN博客 Rust到底值不值得学&#xff0c;之二-CSDN博客 12.2 多线程编程概述 12.2.1 线程…

校园洗护新体验:一键尽享便捷小程序功能全解析

校园洗护新体验&#xff1a;一键尽享便捷小程序功能全解析 1. **用户端尊享**&#xff1a;无论是渴望上门取件的便捷&#xff0c;还是偏爱送货至店的从容&#xff0c;乃至寄存网点的灵活&#xff0c;一切由您指尖掌控&#xff0c;尽享个性化服务。 2. **取货员专业视角**&…

云计算国标发布 云轴科技ZStack参编

近日&#xff0c;国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告&#xff08;2024年第17号&#xff09;。上海云轴信息科技有限公司&#xff08;简称云轴科技ZStack&#xff09;参与起草的国家标准GB/T 32399-2024《信息技术 云计算 参考架构》正式…

分类预测|基于CNN提取特征使用支持向量机作为分类器进行分类预测CNN-SVM(SVM自动寻优c,g超参数)CNN和CNN-SVM

分类预测|基于CNN提取特征使用支持向量机作为分类器进行分类预测CNN-SVM&#xff08;SVM自动寻优c&#xff0c;g超参数&#xff09;CNN和CNN-SVM 文章目录 一、基本原理1. 卷积神经网络&#xff08;CNN&#xff09;简介CNN的基本结构 2. 支持向量机&#xff08;SVM&#xff09;…

WPF-快速构建统计表、图表并认识相关框架

一、使用ScottPlot.Wpf 官网地址&#xff1a;https://scottplot.net/quickstart/wpf/ 1、添加NuGet包&#xff1a;ScottPlot.Wpf 2、XAML映射命名空间&#xff1a; xmlns:ScottPlot"clr-namespace:ScottPlot.WPF;assemblyScottPlot.WPF" 3、简单示例&#xff1a;…

当视频编辑完成后,要将视频进行导出,其中mp4是人们常用的视频格式, Camtasia如何导出工程文件

当视频编辑完成后&#xff0c;要将视频进行导出&#xff0c;其中mp4是人们常用的视频格式。如果视频编辑尚未完成&#xff0c;则可以将工程文件暂时保存在电脑中&#xff0c;以便下次打开使用。今天的文章将为大家介绍Camtasia关于保存的相关内容。接下来我将为大家介绍&#x…

数据结构:树与二叉树

1、树的基本概念 1.1树的定义 树是n个结点的有限集。 若n0&#xff0c;称为空树&#xff1b;若n>0称为非空树&#xff0c;非空树有且仅有一个称之为根的结点。 除根结点以外的其余结点可分成m个互不相交的有限集T1,T2,......Tm,每个有限集合本身又是一棵树&#xff0c;并…

CentOS 部署 RocketMQ 详细指南

1. RocketMQ 5.3.0 简介 什么是 RocketMQ&#xff1f; Apache RocketMQ 是一个分布式消息中间件&#xff0c;最初由阿里巴巴开发并开源。它基于发布-订阅&#xff08;Pub-Sub&#xff09;模式&#xff0c;具有高性能、低延迟和高可靠性等特点。RocketMQ 支持大规模消息流处理…

Win11怎么把C盘分成几个盘?

很多Windows11用户会发现&#xff0c;系统默认只给电脑分配了一个C盘&#xff0c;而C盘不仅是系统盘&#xff0c;还是软件的默认安装位置&#xff0c;并且个人数据也是保存在C盘。这种情况下&#xff0c;电脑使用时间久了会遇到一个常见问题&#xff1a;C盘空间不足或是需要将C…

elasticsearch文档Delete By Query API(一)

这里的查询需要使用和Search API&#xff08;后文会讲&#xff09;相同的方式来将查询条件作为query的值传递&#xff0c;当然也可以使用q关键字&#xff0c;例如如下请求&#xff1a; curl -X POST “localhost:9200/twitter/_delete_by_query?pretty&quser:kimchy” -H…

828华为云征文|华为云Flexus X实例docker部署srs6并调优,协议使用webrtc与rtmp

828华为云征文&#xff5c;华为云Flexus X实例docker部署srs6并调优&#xff0c;协议使用webrtc与rtmp 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务…