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

记忆化搜索【下】

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;}
};

相关文章:

  • 【论文阅读】CiteTracker: Correlating Image and Text for Visual Tracking
  • 输送线相机拍照信号触发(博途PLC高速计数器中断立即输出应用)
  • 解决npm i 安装报npm ERR! code E401
  • 2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)
  • mybatis框架基础以及自定义插件开发
  • 极米科技:走出舒适圈,推动数据架构现代化升级 | OceanBase 《DB大咖说》
  • JavaScript 根据关键字匹配数组项
  • 算法练习题17——leetcode54螺旋矩阵
  • Go语言设计与实现 学习笔记 第六章 并发编程(3)
  • python基础语法十一-赋值、浅拷贝、深拷贝
  • 零知识证明在BSV网络上的应用
  • YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)
  • Flask中实现WebSocket需要什么组件
  • 如何在mac上玩使命召唤手游?苹果电脑好玩的第一人称射击游戏推荐
  • 面对Redis数据量庞大时的应对策略
  • hexo+github搭建个人博客
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Angular数据绑定机制
  • iOS 系统授权开发
  • jquery cookie
  • PHP的Ev教程三(Periodic watcher)
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 仿天猫超市收藏抛物线动画工具库
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何胜任知名企业的商业数据分析师?
  • 十年未变!安全,谁之责?(下)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # 数据结构
  • ### RabbitMQ五种工作模式:
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #数据结构 笔记一
  • $(selector).each()和$.each()的区别
  • (13)DroneCAN 适配器节点(一)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (黑马C++)L06 重载与继承
  • (一)u-boot-nand.bin的下载
  • (转)linux 命令大全
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • **python多态
  • ../depcomp: line 571: exec: g++: not found
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .bat文件调用java类的main方法
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net OpenCVSharp生成灰度图和二值图
  • .net6使用Sejil可视化日志
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET简谈设计模式之(单件模式)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思