记忆化搜索【下】

server/2024/10/22 15:31:32/

375. 猜数字大小II

题目分析

题目链接:375. 猜数字大小 II - 力扣(LeetCode)

题目比较长,大致意思就是给一个数,比如说10,定的数字是7,让我们在[1, 10]这个区间猜。

如果猜大或猜小都会说明是大了还是小了,此外,我们还需要支付猜错数字对应的现金。

现在就是让我们定制一个猜测策略,确保准备最少的钱能猜对

image-20240907200816186

如果采用二分查找,只能确保最小次数,题目要求的是最小金额

算法原理

image-20240907203641775

随便选一个数i最为起始位置,如果不对就进入往下找:

  1. 选小了:[1, i-1]
  2. 选大了:[i+1,10]

从这里面继续选一个数作为“根节点”,这就出现了重复情况了:

  • 给一个区间,选一个头,在左右子树里面找出最小值

当以i为根节点的时候,左右子树返回的值,选择较大值,因为确保在整个操作当中,都是完胜的。

代码实现

暴搜:

会超时

class Solution {
public:int getMoneyAmount(int n){return dfs(1, n);}int dfs(int left, int right){//left > right 此时区间不合法,选不出来//left == right 到叶子节点了,就是要选择的,选对不用支付if(left >= right){return 0;}int ret = INT_MAX;for(int i = left; i <= right; i++){int l = dfs(left, i-1);int r = dfs(i+1, right);ret = min(ret, i+max(l, r));}return ret;}
};

记忆化搜索:

出现重复情况,可采用记忆化搜索

image-20240907210049861

class Solution {
public:int memo[201][201];int getMoneyAmount(int n){return dfs(1, n);}int dfs(int left, int right){//left > right 此时区间不合法,选不出来//left == right 到叶子节点了,就是要选择的,选对不用支付if(left >= right){return 0;}if(memo[left][right] != 0){return memo[left][right];}int ret = INT_MAX;for(int i = left; i <= right; i++){int l = dfs(left, i-1);int r = dfs(i+1, right);ret = min(ret, i+max(l, r));}memo[left][right] = ret;return ret;}
};

329. 矩阵中的最长递增路径

题目链接:329. 矩阵中的最长递增路径

题目较短,就不分析了

算法原理

找个一个位置,上下左右开始试,如果有递增的,则走到下一个节点,然后又开始上下左右尝试,记录最长的情况

代码实现

暴搜会超时,记忆化搜索加一个备忘录即可

class Solution {
public:int memo[201][201];int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};vector<vector<int>> matrix;int m, n;int longestIncreasingPath(vector<vector<int>>& _matrix){matrix = _matrix;int ret = 0;m = matrix.size();n = matrix[0].size();for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){ret = max(ret, dfs(i, j));}}return ret;}int dfs(int i, int j){if(memo[i][j] != 0){return memo[i][j];}int path = 1;for(int k = 0; k < 4; k++){int x = i + dx[k];int y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] > matrix[i][j]){path = max(path, dfs(x, y)+1);}}memo[i][j] = path;return path;}
};

http://www.ppmy.cn/server/116120.html

相关文章

拱式桥安全结构健康监测解决方案

拱式桥作为一种常见的桥梁结构&#xff0c;其拱形设计不仅美观&#xff0c;还具有较高的承载能力。然而&#xff0c;随着使用年限的增加和环境因素的影响&#xff0c;拱式桥的结构健康和稳定需要持续监测和评估。自动化监测技术的应用&#xff0c;可以提升拱式桥的监测效率和准…

程易科技AI OS:赋能开发者,构建智慧未来

【引言】 随着人工智能技术的迅猛发展&#xff0c;越来越多的企业和个人投身于AI应用的研发之中。在这个过程中&#xff0c;一套高效、灵活且功能强大的开发平台显得尤为重要。程易科技推出的人工智能操作系统&#xff08;AI OS&#xff09;&#xff0c;正是为了满足这一市场需…

Docker部署tenine实现后端应用的高可用与负载均衡

采用Docker方式的Tengine 和 keepalived 组合模式可以实现小应用场景的高可用负载均衡需求 目录 网络架构一、环境准备二、软件安装1. 下载Tenine镜像2. 下载Keepalived镜像3. 制作SpringBoot镜像 三、软件配置1. 创建应用容器2. 代理访问应用3. 创建Keepalived4. 测试高可用 网…

腾讯云、阿里云、华为云优惠券领取、查看、使用教程分享

腾讯云、阿里云、华为云是知名的云计算服务商&#xff0c;它们不仅提供了丰富的云产品和服务&#xff0c;还经常推出各种优惠券活动&#xff0c;以吸引新用户并回馈老用户。本文将为大家分享腾讯云、阿里云、华为云优惠券领取、查看和使用教程&#xff0c;帮助大家更好地享受云…

锐捷交换机常用命令

文章目录 1. 基本操作命令2. 接口配置3. VLAN配置4. 链路聚合5. 生成树协议6. 端口安全7. 常用查看命令8. 系统管理9. 配置端口镜像10. 配置生成树协议 1. 基本操作命令 进入特权模式&#xff1a;enable 进入全局配置模式&#xff1a;configure terminal 保存配置&#xff1a;…

CTF 竞赛密码学方向学习路径规划

目录 计算机科学基础计算机科学概念的引入、兴趣的引导开发环境的配置与常用工具的安装Watt Toolkit&#xff08;Steam&#xff09;、机场代理Scoop&#xff08;Windows 用户可选&#xff09;常用 Python 库SageMathLinux小工具 yafuOpenSSL Markdown编程基础Python其他编程语言…

PDF扫描版文字识别OCR

PDF扫描版文字识别OCR 最近需要有对PDF扫描版进行文字可识别的需求&#xff0c;这里介绍一款工具挺好用的 这是一款开源的OCR工具 github地址 https://github.com/hiroi-sora/Umi-OCR 主要功能及特点 免费&#xff1a;本项目所有代码开源&#xff0c;完全免费。方便&#…

基础的八股

JS this 全局&#xff1a;this指向window 函数&#xff1a;this指向window 对象&#xff1a;this指向调用它的 get、post的区别 1、写的地方不同&#xff1a;get在地址栏里 地址栏有多长就只能写多少、post在请求体里 没有上限 2、关于回退和刷新&#xff1a;get回退和刷新没问…