leetcode375. 猜数字大小 II(动态规划-java)

news2024/12/23 10:27:23

猜数字大小 II

  • lc - 375 猜数字大小 II
    • 题目描述
    • 暴力递归 + 记忆化搜索
    • 代码演示
    • 动态规划
  • 动态规划

lc - 375 猜数字大小 II

题目描述

我们正在玩一个猜数游戏,游戏规则如下:
我从 1 到 n 之间选择一个数字。
你来猜我选了哪个数字。
如果你猜到正确的数字,就会 赢得游戏 。
如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。
每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会 输掉游戏 。
给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。

示例1:
在这里插入图片描述
输入:n = 10
输出:16
解释:制胜策略如下:

  • 数字范围是 [1,10] 。你先猜测数字为 7 。
    - 如果这是我选中的数字,你的总费用为 $0 。否则,你需要支付 $7 。
    - 如果我的数字更大,则下一步需要猜测的数字范围是 [8,10] 。你可以猜测数字为 9 。
    - 如果这是我选中的数字,你的总费用为 $7 。否则,你需要支付 $9 。
    - 如果我的数字更大,那么这个数字一定是 10 。你猜测数字为 10 并赢得游戏,总费用为 $7 + $9 = $16 。
    - 如果我的数字更小,那么这个数字一定是 8 。你猜测数字为 8 并赢得游戏,总费用为 $7 + $9 = $16 。
    - 如果我的数字更小,则下一步需要猜测的数字范围是 [1,6] 。你可以猜测数字为 3 。
    - 如果这是我选中的数字,你的总费用为 $7 。否则,你需要支付 $3 。
    - 如果我的数字更大,则下一步需要猜测的数字范围是 [4,6] 。你可以猜测数字为 5 。
    - 如果这是我选中的数字,你的总费用为 $7 + $3 = $10 。否则,你需要支付 $5 。
    - 如果我的数字更大,那么这个数字一定是 6 。你猜测数字为 6 并赢得游戏,总费用为 $7 + $3 + $5 = $15 。
    - 如果我的数字更小,那么这个数字一定是 4 。你猜测数字为 4 并赢得游戏,总费用为 $7 + $3 + $5 = $15 。
    - 如果我的数字更小,则下一步需要猜测的数字范围是 [1,2] 。你可以猜测数字为 1 。
    - 如果这是我选中的数字,你的总费用为 $7 + $3 = $10 。否则,你需要支付 $1 。
    - 如果我的数字更大,那么这个数字一定是 2 。你猜测数字为 2 并赢得游戏,总费用为 $7 + $3 + $1 = $11 。
    在最糟糕的情况下,你需要支付 $16 。因此,你只需要 $16 就可以确保自己赢得游戏。

示例2:
输入:n = 1
输出:0
解释:只有一个可能的数字,所以你可以直接猜 1 并赢得游戏,无需支付任何费用。

示例3:
输入:n = 2
输出:1
解释:有两个可能的数字 1 和 2 。

  • 你可以先猜 1 。
    - 如果这是我选中的数字,你的总费用为 $0 。否则,你需要支付 $1 。
    - 如果我的数字更大,那么这个数字一定是 2 。你猜测数字为 2 并赢得游戏,总费用为 $1 。
    最糟糕的情况下,你需要支付 $1 。

提示:
1 <= n <= 200

暴力递归 + 记忆化搜索

比较容易想到的做法为使用「递归」进行求解。
设计递归函数为 int dfs(int l, int r) 传入参数 l 和 r 代表在范围
内进行猜数,返回值为在[l,r]
内猜中数字至少需要多少钱。
我们可决策的部分为「选择猜哪个数」,而不可决策的是「选择某个数之后(假设没有猜中),真实值会落在哪边」。
因此为求得「最坏情况下最好」的结果,我们应当取所有的
中的最小值。
最后,为减少重复计算,我们需要在「递归」基础上加入记忆化搜索。

代码演示

  static int[][]cache = new int[201][201];
    public int getMoneyAmount1(int n) {
        return dfs(1, n);
    }

    /**
     * 记忆化搜索
     * @param l
     * @param r
     * @return
     */
    public int dfs(int l,int r){
        if (l >= r){
            return 0;
        }
        if (cache[l][r] != 0){
            return cache[l][r];
        }
        int ans = Integer.MAX_VALUE;
        for (int x = l;x <= r;x++){
            int cur = Math.max(dfs(l,x - 1),dfs(x + 1,r)) + x;
            ans = Math.min(cur,ans);
        }
        cache[l][r] = ans;
        return ans;
    }

动态规划

同样能够通过「递推」来进行求解。
通过「记忆化搜索」的递归过程,我们发现,在求解 [l,r] 的最小成本时,需要依赖于 [l,i−1]和 [i+1,r] 这样的比 [l,r]更小的区间。
这引导我们使用「区间 DP」进行求解,对「区间 DP」不了解的同学可以先看 「区间 DP」入门题 。
定义 f[l][r]为考虑在 [l,r] 范围内进行猜数的最小成本。
不失一般性的考虑 f[l][r] 该如何计算。同样的,我们可决策的部分为「选择猜哪个数 x」,而不可决策的是「选择某个数 x 之后(假设没有猜中),真实值在落在哪边」。
我们对本次选择哪个数进行讨论,假设本次选择的数值为 x ( l<=x<=r),则有 cur=max⁡(f[l][x−1],f[x+1][r])+x
最终的 f[l][r] 为所有可选的数值 x 中的最小值。

代码:

    /**
     * 动态规划
     * @param n
     * @return
     */
    public int getMoneyAmount(int n) {
        int[][] ans = new int[201][201];
        for (int len = 2;len <= n;len++){
            for (int l = 1;l + len - 1 <= n;l++){
                int r = l + len - 1;
                ans[l][r] = Integer.MAX_VALUE;
                for (int k = l;k <= r;k++){
                    int cur = Math.max(ans[l][k -1],ans[k + 1][r]) + k;
                    ans[l][r] = Math.min(ans[l][r],cur);
                }
            }
        }
        return ans[1][n];
    }

动态规划

力扣 1155. 掷骰子等于目标和的方法数

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

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

相关文章

开学季 | 新生入学必备好物,快来看看你漏掉了哪些!

一转眼年就过完了&#xff0c;又到了开学季。有很多学生又要重新走进校园&#xff0c;开始自己的学生宿舍生活。作为一个从初中就开始住宿舍的过来人&#xff0c;有一些东西确实是我当时在学校里用过的&#xff0c;非常好用的神器&#xff0c;可以非常好的帮助我们生活、学习或…

界面组件DevExpress Reporting——支持图表本地化和可绑定属性

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 在最近的更新(v23.1)中&#xff0c;官方扩展了…

无脑入门pytorch系列(三)—— nn.Linear

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

智能设备管理系统对企业设备管理效果有作用吗?

智能设备管理系统对企业设备管理效果具有显著的作用和积极的影响。它可以提高设备管理的效率、准确性和可靠性&#xff0c;帮助企业降低运营成本、提高生产效率&#xff0c;并为企业提供更好的决策支持。以下是智能设备管理系统对企业设备管理效果的几个方面影响&#xff1a; …

手机图片怎么转换成pdf?这几个转换方法看看

手机图片怎么转换成pdf&#xff1f;如果你在手机上需要将一些图片转换成PDF文件&#xff0c;将图片转为PDF文档有多种优点。首先&#xff0c;PDF格式是一种通用的文件格式&#xff0c;可以在几乎所有设备上进行查看和打印&#xff0c;而且保留了原始文件的格式和布局。其次&…

为什么很多人认为ChatGPT最好的替代工具是Claude?

ChatGPT引领着生成式AI聊天机器人领域&#xff0c;但Claude AI看起来是一个有力的竞争者。 前段时间&#xff0c;ChatGPT的强劲竞争对手Claude2面世。当时很多人认为它可能会取代ChatGPT&#xff0c;在体验过一段时间之后&#xff0c;深以为然。原因如下&#xff1a; 更强大的…

使用vscode进行远程调试

官方调试手册&#xff1a;vscode官方调试手册 1.安装python扩展 如果是远程连接的话&#xff0c;一定要在ssh上启用扩展。不然创建基于python的配置文件时就会提示&#xff0c;无python扩展。 2.新建配置文件&#xff0c;并修改参数 点击左侧第四个按钮&#xff0c;运行与调试…

一、Dubbo 简介与架构

一、Dubbo 简介与架构 1.1 应用架构演进过程 单体应用&#xff1a;JEE、MVC分布式应用&#xff1a;SOA、微服务化 1.2 Dubbo 简介一种分布式 RPC 框架&#xff0c;对专业知识&#xff08;序列化/反序列化、网络、多线程、设计模式、性能优化等&#xff09;进行了更高层的抽象和…

“new出对象“原理的深层解密

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

网络安全(自学)

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

数字鸿沟,让气候脆弱者更脆弱

随着科技的飞速发展&#xff0c;数字化正在改变我们的生活方式和社会结构。然而&#xff0c;数字鸿沟&#xff08;Digital Divide&#xff09;这一长期存在的问题&#xff0c;却在某些方面加剧了社会的不平等现象。在此&#xff0c;我们将探讨数字鸿沟如何加剧了气候脆弱者的脆…

帮助中心干货:7步即可在线搞定产品帮助中心!

在产品的生命周期中&#xff0c;帮助中心是一个非常重要的部分&#xff0c;它能够为用户提供必要的信息和解决方案&#xff0c;帮助他们更好地使用产品。如果你正在寻找一种简单高效的方法来在线搭建产品帮助中心&#xff0c;那么这篇干货文章将为你提供7个步骤&#xff0c;让你…

Spring Boot+Redis 实现一个简单的限流器示例

Spring BootRedis 实现一个简单的限流器&#xff0c;限制 文章目录 Spring BootRedis 实现一个简单的限流器&#xff0c;限制0.前言1.基础介绍2.步骤2.1. 引入依赖2.2. 配置文件2.3. 核心源码优化后再优化一下加入布隆过滤器 4.总结5.参考文档6. Redis从入门到精通系列文章 0.前…

【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入传统方案实现实现分析 介绍基本介绍登场角色 案例实现案例一类图实现 案例二类图实现问答 策略模式在JDK源码中的使用总结文章说明 案例引入 有各种鸭子&#xff0c;比如野鸭、北京鸭、水鸭等。 鸭子有各种行为&#xff0c;比如走路、叫、飞行等。不同鸭子的…

跨境电商ERP源码选择指南:如何挑选最适合您的方案

在如今充满机遇的跨境电商领域&#xff0c;选择适合自己的ERP源码方案至关重要。然而&#xff0c;众多选择使得挑选变得棘手。作为跨境电商ERP源码领域的专家&#xff0c;我将揭示7个权威建议&#xff0c;帮助您在海量方案中快速、准确地找到最适合您的ERP源码。让我们一起深入…

元宇宙赛道加速破圈 和数软件抓住“元宇宙游戏”发展新风口

当下海外游戏市场仍然具备较大的增长空间。据机构预测&#xff0c;至2025年全球移动游戏市场规模将达1606亿美元&#xff0c;对应2020-2025年复合增长率11&#xff05;。与此同时&#xff0c;随着元宇宙概念持续升温&#xff0c;国内外多家互联网巨头纷纷入场。行业分析平台New…

Android布局【GridLayout】

文章目录 GridLayout概述常见属性子控件属性项目结构主要代码 GridLayout概述 GridLayout也名网格布局,该布局与TableLayout类似&#xff0c;但与其相比&#xff0c;GridLayout会更加的灵活&#xff0c;比如 TableLayout不能将两行进行一个合并&#xff0c;只能将两列进行一个…

新能源汽车电控系统

新能源汽车电控系统主要分为&#xff1a;三电系统电控系统、高压系统电控系统、低压系统电控系统 三电系统电控系统 包括整车控制器、电池管理系统、驱动电机控制器等。 整车控制器VCU 整车控制器作为电动汽车中央控制单元&#xff0c;是整个控制系统的核心&#xff0c;也是…

C#_编码奥秘

什么是编码&#xff1f; 将信息&#xff08;文字、图像、声音、视频、代码&#xff09;使用特定的符号组合表示出来的过程。 任何信息载体都是编码&#xff0c;编码是 信息通信 与 信息处理 技术的基础。 编码与信息通信 长亮三下&#xff08;S&#xff09;&#xff0c;短亮三…

中小企业选择CRM系统需要有哪些功能?

对于中小企业来说&#xff0c;选择一个合适的CRM系统是非常重要的&#xff0c;一款好用的CRM可以帮助企业提高业务效率&#xff0c;获得更多收益。那么&#xff0c;中小企业CRM系统的主要特点有哪些呢&#xff1f;下面我们从四个方面来说说。 1、功能&#xff1a; 功能是指CR…