记忆化搜索【下】

news2024/12/23 10:04:44

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.coloradmin.cn/o/2115265.html

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

相关文章

2024AI绘画工具排行榜:探索最受欢迎的AI绘图软件特点与选择指南

AI绘画工具各有优势&#xff0c;从开放性到对特定语言和文化的支持&#xff0c;以及对图像细节和艺术性的不同关注点&#xff0c;根据具体需求选择合适的工具 MidJourney 图片品质卓越&#xff0c;充满独特创意&#xff0c;初期能够免费获取数十账高质量图片&#xff0c;整个生…

C++20中支持的非类型模板参数

C20中支持将类类型作为非类型模板参数&#xff1a;作为模板参数传入的对象具有const T类型&#xff0c;其中T是对象的类型&#xff0c;并且具有静态存储持续时间(static storage duration)。 在C20之前&#xff0c;非类型模板参数仅限于&#xff1a;左值引用类型、整数类型、指…

VMware Fusion Pro 13 Mac版虚拟机 安装Win11系统教程

Mac分享吧 文章目录 Win11安装完成&#xff0c;软件打开效果一、VMware安装Windows11虚拟机1️⃣&#xff1a;准备镜像2️⃣&#xff1a;创建虚拟机3️⃣&#xff1a;虚拟机设置4️⃣&#xff1a;安装虚拟机5️⃣&#xff1a;解决连不上网问题 安装完成&#xff01;&#xff0…

用Pytho解决分类问题_DBSCAN聚类算法模板

一&#xff1a;DBSCAN聚类算法的介绍 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff09;是一种基于密度的聚类算法&#xff0c;DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇&#xff0c;并能够在具有噪声的空间数据库中发…

关于SpringMVC的理解

1、SpringMVC 应用 1.1、简介 1.1.1、MVC 体系结构 三层架构&#xff1a; 我们的开发架构⼀般都是基于两种形式&#xff0c;⼀种是 C/S 架构&#xff0c;也就是客户端/服务器&#xff1b;另⼀种是 B/S 架构&#xff0c;也就是浏览器服务器。在 JavaEE 开发中&#xff0c;⼏乎…

陪护系统|陪护系统源码|护理陪护小程序

随着医疗水平的不断提高&#xff0c;人们对护理服务的需求也越来越高。为了更好地满足患者和家属的需求&#xff0c;陪护系统定制开发应运而生。 陪护系统定制开发是根据医疗机构的实际需求&#xff0c;设计并开发一套专门用于陪护服务的系统。该系统拥有一系列丰富的功能&…

基于人工智能的图片生成系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图片生成是计算机视觉领域的一个重要任务&#xff0c;基于生成对抗网络&#xff08;GAN&#xff09;的图片生成系统能够从噪声中生成逼…

大数据-119 - Flink Window总览 窗口机制-滚动时间窗口-基于时间驱动基于事件驱动

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

揭秘 AMD GPU 上 PyTorch Profiler 的性能洞察

Unveiling performance insights with PyTorch Profiler on an AMD GPU — ROCm Blogs 2024年5月29日&#xff0c;作者&#xff1a;Phillip Dang。 在机器学习领域&#xff0c;优化性能通常和改进模型架构一样重要。在本文中&#xff0c;我们将深入探讨 PyTorch Profiler&#…

小白建立个人网站初步尝试

一、VScode 代码是在VScode上运行的&#xff0c;可以看作者另一篇文章&#xff1a;http://t.csdnimg.cn/mOmdF 二、代码基本框架 代码解释<!DOCTYPE html>声明为HTML5文档<html><head>头部元素&#xff0c;不显示在页面<meta charset"utf-8"…

数学建模强化宝典(14)Fisher 最优分割法

前言 Fisher最优分割法是一种对有序样品进行聚类的方法&#xff0c;它在分类过程中不允许打破样品的顺序。这种方法的目标是找到一种分割方式&#xff0c;使得各段内样品之间的差异最小&#xff0c;而各段之间的差异最大。以下是关于Fisher最优分割法的详细介绍&#xff1a; 一…

【LeetCode热题100】前缀和

这篇博客共记录了8道前缀和算法相关的题目&#xff0c;分别是&#xff1a;【模版】前缀和、【模版】二维前缀和、寻找数组的中心下标、除自身以外数组的乘积、和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和。 #include <iostream> #include <vector> …

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽 “弃工从研”的路上很孤独&#xff0c;于是我记下了些许笔记相伴&#xff0c;希望能够帮助到大家 知识点 1. 散列查找 散列查找是一种高效的查找方法&#xff0c;它通过散列函数将关键字映射到数组的一个位置&#xff0c;从而实现快速查找。这种方法的时间复杂度平均为…

自我指导:提升语言模型自我生成指令的能力

人工智能咨询培训老师叶梓 转载标明出处 传统的语言模型&#xff0c;尤其是经过指令微调的大型模型&#xff0c;虽然在零样本&#xff08;zero-shot&#xff09;任务泛化上表现出色&#xff0c;但它们高度依赖于人类编写的指令数据。这些数据往往数量有限、多样性不足&#xf…

配置Java(JDK)环境变量

一、配置JDK环境变量 将JDK-22压缩包加压缩到指定目录下面&#xff0c;本机路径是&#xff1a;C:\Program Files\Java&#xff08;可以加压缩到自己的指定路径&#xff0c;记住这个路径&#xff0c;配置环境变量时候要使用&#xff09;。 鼠标右键“此电脑”&#xff0c;点击“…

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考 MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触…

Spring框架-----ioc

基本概念 Spring 是一个轻量级的,IOC和AOP的一站式Java 开发框架&#xff0c;是为了简化企业级应用开发而生的 轻量级&#xff1a;框架核心模块体积小 IOC:Inversion of Control&#xff08;控制反转&#xff09;把创建对象的控制权反转给Spring框架管理 以前我们程序中需要…

Linux下构建Docker镜像

Docker在Linux构建镜像 Docker是一种轻量级的容器化技术&#xff0c;可以让开发者将应用程序及其所有依赖项打包到一个独立的容器中&#xff0c;从而实现跨平台和快速部署&#xff0c;在Linux系统上&#xff0c;我们可以使用D0cker来构建自己的镜像&#xff0c;并且可以通过简…

RocketMQ学习(三)

文章目录 1. 高级功能1.1 消息存储1.1.1 存储介质关系型数据库DB文件系统 1.1.2 性能对比1.1.3 消息的存储和发送1&#xff09;消息存储2&#xff09;消息发送 1.1.4 消息存储结构1.1.5 刷盘机制1&#xff09;同步刷盘2&#xff09;异步刷盘3&#xff09;配置 1.2 高可用性机制…

软件设计之JavaWeb(1)

软件设计之JavaWeb(1) 此篇应在MySQL之后进行学习: 路线图推荐&#xff1a; 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷全新JavaWeb教程&#xff0c;企业主流javaweb技术栈 资料可以去尚硅谷官网免费领取 此章节最好学完JDBC观看 学习内容&#xff1a; XML概述T…