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

猜数字大小 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.hqwc.cn/news/66403.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微型导轨在包棉机中的作用

随着工业革命的开展&#xff0c;各种人工智能设备的迅猛发展&#xff0c;为了适应高速发展的工业自动化&#xff0c;越来越多的工业企业开始采用微型导轨&#xff0c;尤其是在包棉机中的应用。 包棉机是一种用于加工棉花的机械设备&#xff0c;它的主要功能是将原始棉花经过清洁…

Wlan——CAPWAP隧道的建立过程

CAPWAP基本概念 CAPWAP全称为无线接入点的控制和配置协议&#xff08;Control And Provisioning of Wireless Access Points Protocol Specification&#xff09; CAPWAP协议主要作用 1、AP可以通过CAPWAP实现自动发现AC 2、AC通过CAPWAP协议对AP进行管理、业务配置下发 3…

电信流失用户画像

三大运营商电信、联通、移动&#xff0c;都想扩大自己的客户群体。据研究&#xff0c;获取新客户所需的成本远高于保留现有客户的成本。因此为了满足在激烈竞争中的优势&#xff0c;提前预测出用户是否会流失&#xff0c;采取保留措施成为一大挑战。本文和你一起探索电信流失客…

7.1 动手实现AlexNet

AlexNet引入了dropput层 代码 import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(# 样本数为1,通道数为96,11x11的卷积核,步幅为4&#xff0c;减少输出的高度和深度。 LeNet的通道数才6&#xff0c;此处96&#xff0c;为什么要增加这么多通…

VS2017 查看dll

dumpbin /exports xxxx.dll 导出函数 dumpbin /dependents xxxx.dll 依赖关系

打造数字化营销闭环,破解精准获客难题

现阶段&#xff0c;企业需要进行数字化营销闭环&#xff0c;以实现更精确的客户获取。随着数字技术的迅猛发展&#xff0c;企业需要将在线广告、社交媒体营销和数据分析等工具相互结合&#xff0c;建立一个完整的数字化营销流程。通过使用客户细分、精准定位和个性化广告等手段…

layui的基本使用-日期控件的业务场景使用入门实战案例一

效果镇楼&#xff1b; 1 前端UI层面&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

基于K8S环境部署Dolphinscheduler及简单应用

一、Dolphinscheduler简介 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系,并为应用…

学C的第三十三天【C语言文件操作】

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十二天【动态内存管理】_高高的胖子的博客-CSDN博客 1 . 为什么要使用文件 以前面写的通讯录为例&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录中增加、删…

Java课题笔记~ JSP开发模型

MVC 1.JSP演化历史 1. 早期只有servlet&#xff0c;只能使用response输出标签数据&#xff0c;非常麻烦 2. 后来有了jsp&#xff0c;简化了Servlet的开发&#xff0c;如果过度使用jsp&#xff0c;在jsp中即写大量的java代码&#xff0c;有写html表&#xff0c;造成难于维护&…

生信豆芽菜-单基因与基因集的关系

网址&#xff1a;http://www.sxdyc.com/panCancerGeneSet 该工具主要用于查看单基因在泛癌中与各个不同基因集的相关性 提交后等待运行成功即可&#xff0c;还可以关注公众号&#xff1a;豆芽数据分析

runtime error: member access within misaligned address(力扣最常见错误之一)

runtime error: member access within misaligned address&#xff08;力扣最常见错误之一&#xff09; 前言原因和解决办法总结 前言 最近博主在刷力扣时&#xff0c;明明代码逻辑都没问题&#xff0c;但总是报下面这个错误&#xff1a; runtime error: member access within…