记忆化搜索——1

目录

1.斐波那契数

2.不同路径

3.最长递增子序列

4.猜数字大小2

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


1.斐波那契数

该题规律很明显,就直接放记忆化搜索的版本了

class Solution {
public:int dfs(int n){if(n==0||n==1)//递归出口{return n;}if(f[n-1]==-1)//检查是否已经记忆过{f[n-1]=dfs(n-2)+dfs(n-3);}if(f[n-2]==-1)//检查是否已经记忆过{f[n-2]=dfs(n-3)+dfs(n-4);}return f[n]=f[n-1]+f[n-2];//状态转移}int fib(int n) {memset(f,-1,sizeof f);f[0]=0,f[1]=1;dfs(n);return f[n];}int f[31];};

2.不同路径

 

class Solution {
public:int dfs(int x, int y){if (x < 1 || y < 1)return 0;//防止越界if (x == 1 && y == 1)return f[x][y];//递归出口if (f[x][y] == -1)//检查是否记忆{f[x][y] = dfs(x - 1, y) + dfs(x, y - 1);}return f[x][y];}int uniquePaths(int m, int n) {memset(f, -1, sizeof f);f[1][1] = 1;return dfs(m, n);}long long f[101][101];
};

3.最长递增子序列

class Solution {
public:void dfs(vector<int>& nums,int index){int ret=1;//临时存放index位置为起点的最长递增子序列长度,因为一个数字最起码长度为1,所以ret默认1for(int i=index+1;i<n;i++){if(nums[index]<nums[i]){if(f[i]==0)dfs(nums,i);//检查标记,剪枝操作ret=max(ret,f[i]+1);//注意+1,因为f是以i为起点的最长递增子序列长度}}f[index]=ret;ans=max(ans,f[index]);}int lengthOfLIS(vector<int>& nums) {n=nums.size();
//以第i位为起点的最长递增子序列长度for(int i=0;i<n;i++){if(f[i]!=0)continue;dfs(nums,i);}
//ans存的是这些最长递增子序列中最长的长度return ans;
//注意,我试过当前函数直接一个dfs,然后直接返回,因为最后f所有位置都要填上,所以
//我直接在dfs里疯狂展开,没填就展开,也可以过,但是效率比在这里用for循坏差一点,几十毫秒的差距}int ans=0;int n;int f[2501];//存以当前位置为起点的最长递增子序列长度
};

4.猜数字大小2

class Solution {
public:void dfs(int l,int r){if(l>=r){return ;}
//注意,如果l>r,说明这不是一个合法区间,不用管
//如果l==r,说明没必要付钱,因为这个数字是一定会被找到的
//而f数组默认都是0,所以直接返回就好int ret=99999999;
//一个大数,因为下面要用来比小for(int i=l;i<=r;i++){if(f[l][i-1]==0)dfs(l,i-1);if(f[i+1][r]==0)dfs(i+1,r);
//检查标记,剪枝操作ret=min(ret,i+max(f[l][i-1],f[i+1][r]));
//这个部分看图,主要是,一个区间最优解是列举区间每个数字作为第一个猜的数,然后一直猜猜到每个数都被猜过为止所花费的金额,这些金额的最小值就是这个区间的最优解。
//每个作为当前区间第一个猜的数所分割的区间,因为是分割,所以是左右区间,根据上面的定义,这个数的最后结果是左右区间最优解中最大的金额加上自身。而每个数都依此算,最后整个区间的最优解就是这些数的结果(金额)的最小值}f[l][r]=ret;}int getMoneyAmount(int n) {dfs(1,n);return f[1][n];}int f[202][202];//存当前区间的最优解,一维下标是左端,二维下标是右端
};

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

class Solution {
public:bool check(int x, int y) {if (x < 0 || y < 0 || x >= m || y >= n)return false;return true;}
//检查是否越界void dfs(vector<vector<int>>& matrix, int x, int y){int ret = 1;for (int i = 0; i < 4; i++){int nx = x + dx[i], ny = y + dy[i];if (check(nx, ny) && matrix[x][y] < matrix[nx][ny]){
//满足不越界且递增的条件进入ifif (f[nx][ny] == 0)dfs(matrix, nx, ny);
//检查标记,剪枝。ret = max(ret, f[nx][ny] + 1);
//取最大}}f[x][y] = ret;
//记录当前结果ans = max(ans, f[x][y]);
//记录最大值return;}int longestIncreasingPath(vector<vector<int>>& matrix) {m = matrix.size();n = matrix[0].size();
//以每个数字为起点开始找,利用f数组,省略很多重复的dfs展开for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (f[i][j] == 0){dfs(matrix, i, j);}}}return ans;}int dx[4] = { 0,0,-1,1 };int dy[4] = { 1,-1,0,0 };int f[201][201];int n, m, ans = 0;
};

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

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

相关文章

JVM 加载阶段 Class对象加载位置是在 堆中还是方法区?

在JVM&#xff08;Java虚拟机&#xff09;的类加载过程中&#xff0c;Class对象的加载位置涉及到堆&#xff08;Heap&#xff09;和方法区&#xff08;Method Area&#xff09;两个关键区域。具体来说&#xff0c;类的加载阶段涉及到将类的.class文件中的二进制数据读入到内存中…

黑丝或者白丝,都可以用LoRA(Stable Diffusion进阶篇:ComfyUI 附加网络)

前言 在学习WebUI的那些基础知识点的时候&#xff0c;有一个东西是每一个初学者都绕不开的大山-附加网络。 这个东西对于每一个接触Stable Diffusion的小伙伴来说就像是小学门口小卖部卖的辣条、初中课本上的涂鸦、高中数学卷解不开的最后一道大题。 学习过WebUI里Stable Di…

揭秘亚马逊新手快速成长背后的秘密:从入门到精通

在亚马逊这个充满机遇与挑战的市场平台上&#xff0c;作为一名深耕多年的卖家&#xff0c;我积累了宝贵的经验和见解。随着市场环境的不断变化&#xff0c;我意识到&#xff0c;无论是新加入的创业者还是经验丰富的老手&#xff0c;都需要不断学习和适应&#xff0c;以在这个平…

游戏行业报告(一)| 中国占全球头部上市游戏企业34%,“智能NPC”竞争方向较受关注

近日&#xff0c;伽马数据发布了《2024中国上市/非上市游戏企业竞争力报告》&#xff0c;本篇文章仅采用《2024中国上市/非上市游戏企业竞争力报告》的部分数据。由于文章太长&#xff0c;所以分了下集&#xff0c;大家可以收藏关注~ 企业全球资本市场竞争现状 全球TOP50上市游…

Motionface ai工具有哪些?

Motionface Android/PC 用一张静态含有人脸相片来生成一个能说会唱的虚拟主播。使用简单便捷&#xff0c;极致的流畅度体验超乎您的想象。 免费下载 Respeak PC电脑软件 任意视频一键生成虚拟主播&#xff0c;匹配音频嘴型同步&#xff0c;保留原视频人物神态和动作&#xff0c…

什么是柔性生产?

柔性生产&#xff0c;是一种能够迅速调整生产流程、产品种类及产量&#xff0c;以低成本、高效率响应市场多样化需求的生产方式。它不仅仅是对生产线硬件的升级&#xff0c;更是对生产组织、管理模式及信息技术的全面革新。柔性生产的核心在于“灵活”二字&#xff0c;即企业能…

JVM(面试用)

目录 一、JVM运行时数据区 二、JVM类加载 类加载过程 1、加载&#xff08;loading&#xff09; 2、验证&#xff08;Verification&#xff09; 3、准备&#xff08;Perparation&#xff09; 4、解析&#xff08;Resolution&#xff09; 5、初始化&#xff08;Initializ…

秒懂C++之deque及反向迭代器

目录 前言 一.deque的常用接口 二.deque的原理 2.1 vector与list的优缺点 2.2 deque的原理 三.反向迭代器 四.全部代码 前言 秒懂C之List-CSDN博客 秒懂C之vector&#xff08;下&#xff09;-CSDN博客 本文后面关于反向迭代器的操作会涉及到前面的文章~ 一.deque的常用接…

uni-app封装组件实现下方滑动弹出模态框

子组件 <template><div class"bottom-modal" :class"{show: showModal}"><div class"modal-content" :class"{show: showModal}"><!-- 内容区域 --><slot></slot></div></div></…

【JAVA多线程】AQS,JAVA并发包的核心

目录 1.概述 1.1.什么是AQS 1.2.AQS和BlockQueue的区别 1.3.AQS的结构 2.源码分析 2.1.CLH队列 2.2.模板方法的实现 2.2.1.独占模式 1.获取资源 2.释放资源 2.2.2.共享模式 1.概述 1.1.什么是AQS AQS非常非常重要&#xff0c;可以说是JAVA并发包&#xff08;java.…

案例开发-日程管理2第一期(超详细教程、配备图文和源代码注释,没学过也能看懂)

文章目录 一、 项目前期准备1.数据库准备2.导入依赖3.pojo包处理4.dao包处理5.service包处理6.controller包处理7.加密工具类的使用8.页面文件的导入 总结 一、 项目前期准备 1.数据库准备 创建schedule_system数据库并执行如下语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHE…

WPF学习(4)- VirtualizingStackPanel (虚拟化元素)+Canvas控件(绝对布局)

VirtualizingStackPanel虚拟化元素 VirtualizingStackPanel 类&#xff08;虚拟化元素&#xff09;和StackPanel 类在用法上几乎差不多。其作用是在水平或垂直的一行中排列并显示内容。它继承于一个叫VirtualizingPanel的抽象类&#xff0c;而这个VirtualizingPanel抽象类继承…

大数据-68 Kafka 高级特性 物理存储 日志存储概述

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

Java之SpringBoot入门(含Spring Mvc)

1.Spring Boot Helper的安装 首先我们要装好Spring Boot Helper 但是由于直接在IDEA中下的是收费版&#xff0c;在学习阶段我们可以去官网下载一些免费版使用 Spring Boot Helper - IntelliJ IDEs Plugin | Marketplace&#xff08;点击即可进入官网&#xff09; 然后在IDEA…

【practise】删除有序数组中的重复项

关于博主&#xff1a; 今天分享一道简单的关于“双指针”算法的题目。算是双指针中非常基础的题目&#xff0c;有兴趣可以借鉴一波~ 目录 1.题目介绍2.题解思路&#xff1a;双指针法3.代码示例 1.题目介绍 题目链接&#xff1a;LINK 本题要求是&#xff1a;对给定的有序数组…

回溯分割+子集篇--代码随想录算法训练营第二十二天| 131.分割回文串,93.复原IP地址,78.子集,90.子集II

131.分割回文串 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a;131.分割回文串 题目描述&#xff1a; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文串 。返回 s 所有可能的分割方案。 示例 …

sql二次注入实战--2018年网顶杯

网址&#xff1a;BUUCTF在线评测 (buuoj.cn) 当我们进入后显示这个页面&#xff1a; 当我们第一次点击发帖的时候就会跳转到登陆页面&#xff0c;上面有提示&#xff0c;告诉我们账号为zhangwei,密码为zhangwei***&#xff1a; 这里我们可以使用bp抓包工具来进行暴力破解密码&…

makefile举例说明

文章目录 makefile文件config.mk配置文件common.mk文件 目录结构 makefile文件 include config.mk导入config.mk的文件&#xff0c;通常包含项目的配置变量。 all:for dir in $(BUILD_DIR); \do \make -C $$dir; \doneall是项目主目标&#xff0c;遍历BUILD_DIR变量每个子目录…

基于springboot+vue+uniapp的“口腔助手”小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

Python开发: 飞机大战 小游戏

玩法 你可以控制飞机左右移动&#xff0c;躲避敌机子弹&#xff0c;同时发射自己的炮弹&#xff0c;将敌人击落&#xff01; 部署方案&#xff1a; 1、代码如下图&#xff1b; 2、将代码保存到一个python中&#xff0c;比如planeFight.py&#xff1b; 3、在你的电脑中安装p…