剑指offer第2版:动态规划+记忆化搜索

前三题是同一种模型,所以我分别用递推、记忆化、动归来做

一、p74-JZ10 斐波那契数列

斐波那契数列_牛客题霸_牛客网

class Solution {
public:int Fibonacci(int n) {// write code hereif(n==1||n==2) return 1;int a=1,b=1,c=1;while(n>2){c=a+b;a=b;b=c;--n;}return c;}
};

二、扩展p77-JZ10青蛙跳台阶

跳台阶_牛客题霸_牛客网

class Solution {
public://这题就用记忆化搜索int memory[41]={0};int jumpFloor(int n) {if(n<=2) return n;//考虑了1和2的情况//此时至少是n==3if(memory[n]) return memory[n];return memory[n]=jumpFloor(n-1)+jumpFloor(n-2);}
};

三、扩展p79-JZ10矩阵覆盖

矩形覆盖_牛客题霸_牛客网

class Solution {
public:int rectCover(int n) {if(n<=2) return n;vector<int> dp(n+1);dp[1]=1,dp[2]=2;for(int i=3;i<=n;++i) dp[i]=dp[i-1]+dp[i-2];//最后放竖的或者放俩正的return dp[n];}
};

四、扩展p78-JZ10青蛙跳台阶扩展问题

跳台阶扩展问题_牛客题霸_牛客网

 动态规划:

//f[n]=f[n-1]+f[n-2]……f[0]
//f[n-1]=f[n-2]+f[n-3]……f[0]
//根据归纳法得f[n]=2*f[n-1]

class Solution {
public:int jumpFloorII(int number) {//动归 f[n]表示跳到n台阶一共有几种跳法//f[n]=f[n-1]+f[n-2]……f[0]//f[n-1]=f[n-2]+f[n-3]……f[0]//根据归纳法得f[n]=2*f[n-1]vector<int> dp(number);dp[0]=1;for(int i=1;i<number;++i) dp[i]=dp[i-1]*2;return dp[number-1];}
};

递归:f[n]=2*f[n-1]我们找到了重复子问题

class Solution {
public:int jumpFloorII(int number) {//1或0都是1种if(number == 1)return 1;//f(n) = 2*f(n-1)return 2 * jumpFloorII(number - 1);}
};

数学规律:根据规律f[n]=2^(n-1) 直接用pow函数

class Solution {
public:int jumpFloorII(int number) {if(number == 1)return 1;return pow(2,number-1);}
};

 五、p124-JZ19 正则表达式匹配

正则表达式匹配__牛客网

 当p[j]==‘.’或者p[j]==s[i]  那么dp[i][j]=dp[i-1][j-1]

当p[j]=='*'的时候,如果p[j-1]==‘.’ 那么dp[i][j-2]||dp[i-1][j-2]……  

                              如果p[j-1]==s[i] 那么dp[i][j-2]||dp[i-1][j-2]||……

//我们可以当*不匹配就是dp[i][j-2] ,或者是*匹配一个然后保留dp[i-1][j] 

class Solution {public:bool match(string s, string p) {//dp[i][j]表示p[0,j]的子串能否匹配s[0,i]的子串int m=s.size(), n= p.size();vector<vector<bool>> dp(m+1,vector<bool>(n+1));s=' '+s,p=' '+p; //为了方便下标的对应//分析边界 *可以和前一个组成空串dp[0][0]=true;for(int j=2;j<=n;j+=2) if(p[j]=='*')dp[0][j]=true; else break;//当p[j]==s[i]||p[j]=='.' dp[i][j]=dp[i-1][j-1]//当p[j]=='*' 此时他可以匹配空,也可以匹配前1个、前两个相同的//*如果啥也不匹配 dp[i][j-2]  或者是干掉一个然后保留dp[i-1][j]for (int i=1;i<=m;++i)for (int j=1;j<=n;++j)if (p[j]=='*')dp[i][j]=dp[i][j-2]||(p[j-1]==s[i]||p[j-1]=='.')&&dp[i-1][j];else dp[i][j]=(s[i]==p[j]||p[j]=='.')&&dp[i-1][j-1];return dp[m][n];}};

六、p218-JZ42连续子数组的最大和

连续子数组最大和_牛客题霸_牛客网

dp[i]表示以i位置为结尾时的最大子数组和 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {int n;cin>>n;vector<int> nums(n),dp(n);for(int i=0;i<n;++i) cin>>nums[i];dp[0]=nums[0];for(int i=1;i<n;++i) dp[i]=max(dp[i-1]+nums[i],nums[i]);cout<<*max_element(dp.begin(),dp.end())<<endl;
}

七、扩展p218-JZ42 连续子数组的最大和(二)

连续子数组的最大和(二)_牛客题霸_牛客网

 与上一题的区别在于我们不仅要统计最大的子数组和,还需要尽量选择最长的,而且还要把他们全都插入到数组里返回(需要记录区间) 

class Solution {
public:vector<int> FindGreatestSumOfSubArray(vector<int>& nums) {//连续子数组的最大和  dp[i]表示以i位置为结尾的最大和子数组int n=nums.size();vector<int> dp(n);dp[0]=nums[0];int begin=0;//标记起始位置和i做一段区间int left=0,right=0;//标记最长的区间int maxsum=nums[0];//记录最大和for(int i=1;i<n;++i){dp[i]=max(nums[i],dp[i-1]+nums[i]);if(nums[i]+dp[i-1]<nums[i]) begin=i;//更新新的起点if(dp[i]>maxsum||dp[i]==maxsum&&(right-left+1)<(i-begin+1)){maxsum=dp[i];left=begin;right=i;}}vector<int> ret;ret.reserve(right-left+1);for(int i=left;i<=right;++i) ret.emplace_back(nums[i]);return ret;}
};

八、p231-JZ46 把数字翻译成字符串

 把数字翻译成字符串_牛客题霸_牛客网

//有s[i]单独编码的时候  dp[i]+=dp[i-1]
//当s[i]和s[i-1]一起编码的时候 dp[i]+=dp[i-2] 

class Solution {
public:int solve(string nums) {//dp[i]表示以i位置为结尾时一共有多少种编码的可能性//有s[i]单独编码的时候  dp[i]+=dp[i-1]//当s[i]和s[i-1]一起编码的时候 dp[i]+=dp[i-2]if(nums=="0") return 0;int n=nums.size();nums=' '+nums;vector<int> dp(n+1);dp[0]=1;//其实没有意义,是为了确保填表的正确dp[1]=(nums[1]!='0');for(int i=2;i<=n;++i){if(nums[i]!='0') dp[i]+=dp[i-1];int val=(nums[i-1]-'0')*10+nums[i]-'0';if(10<=val&&val<=26) dp[i]+=dp[i-2];}return dp[n];}
};

九、p233-JZ47 礼物的最大价值

礼物的最大价值_牛客题霸_牛客网

动态规划 

class Solution {
public:int maxValue(vector<vector<int> >& nums) {int m=nums.size(),n=nums[0].size();//dp[i][j]表示从i j位置选了之后的最大价值vector<vector<int>> dp(m+1,vector<int>(n+1));for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)dp[i][j]=max(dp[i-1][j],dp[i][j-1])+nums[i-1][j-1];return dp[m][n];}
};

 记忆化搜索

class Solution {
public:int m,n;int maxValue(vector<vector<int> >& nums) {m=nums.size(),n=nums[0].size();//dp[i][j]表示从i j位置选了之后的最大价值vector<vector<int>> memory(m,vector<int>(n));return dfs(nums,m-1,n-1,memory);//统计最大价值}int dfs(vector<vector<int> >& nums,int i,int j,vector<vector<int> >& memory){if(i==0&&j==0) return nums[0][0];//到达了起点if(memory[i][j]) return memory[i][j];if(i==0) return memory[0][j]=nums[0][j]+dfs(nums,0,j-1,memory);if(j==0) return memory[i][0]=nums[i][0]+dfs(nums,i-1,0,memory);return memory[i][j]=nums[i][j]+max(dfs(nums,i-1,j,memory),dfs(nums,i,j-1,memory));}
};

十、p312-JZ66 构建乘积数组

 构建乘积数组_牛客题霸_牛客网

使用前缀积和后缀积数组  然后构建结果集 

    vector<int> multiply(vector<int>& nums) {//前缀积和后缀积问题int n=nums.size();if(n==1) return {};vector<int> ret(n);vector<int> dpq(n,1);vector<int> dph(n,1);//前缀积for(int i=1;i<n;++i) dpq[i]=dpq[i-1]*nums[i-1];//后缀积for(int i=n-2;i>=0;--i) dph[i]=dph[i+1]*nums[i+1];//搞结果集for(int i=0;i<n;++i) ret[i]=dpq[i]*dph[i];return ret;}
};

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

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

相关文章

Unity 调节 Rigidbody2D 响应速度的解决方案【资料】

可以通过多种方式调节 Unity 中 Rigidbody2D 的响应速度&#xff0c;包括降低物理更新频率、屏蔽过小值以及优化物理参数。以下是几种有效的实现方法&#xff1a;1. 降低物理更新频率&#xff08;不推荐直接修改&#xff09;虽然可以修改 Time.fixedDeltaTime 来降低物理更新频…

力扣-189.轮转数组

题目链接 189.轮转数组 class Solution {public void reverse(int[] nums, int i, int j) {while (i < j && i > 0 && j < nums.length) {int temp nums[i];nums[i] nums[j];nums[j] temp;i;j--;}}public void rotate(int[] nums, int k) {k k …

Linux命令行安装Climate Data Operators(CDO)的方法

本文介绍在Linux操作系统的发行版本Ubuntu中&#xff0c;基于命令行&#xff0c;配置Climate Data Operators&#xff08;CDO&#xff09;这个用于操作、分析气候及其他相关数据的命令行工具的方法。 最近&#xff0c;需要对一批.nc格式文件加以处理&#xff1b;在之前&#xf…

如何为您的服务器选择正确的 PHP 版本

PHP作为最流行的服务器端脚本语言之一&#xff0c;持续演进并定期发布新版本。为您的服务器选择正确的PHP版本对于网站性能、安全性和功能兼容性至关重要。本文将指导您如何做出明智的选择。了解PHP版本的生命周期在选择PHP版本前&#xff0c;首先需要了解PHP的版本支持政策&am…

从0开始的中后台管理系统-5(userList动态展示以及上传图片和弹出创建用户表单)

项目用的都是antd组件&#xff0c;这里的userList组件展示的表单组件的数据直接get请求拿过来展示的&#xff0c;这里随机生成了50个用户只是为了展示表单的api设置。首先就是表单展示需要两个参数current和pageSize两个属性控制表单的最大分页和当前页面。那么我们就设置初始值…

Spring MVC REST API设计详解:从零构建高效接口

1. Spring MVC与REST API基础1.1 RESTful架构的六大约束详解RESTful架构是Roy Thomas Fielding在2000年博士论文中提出的软件架构风格&#xff0c;它包含六个核心约束&#xff0c;这些约束共同构成了RESTful API的设计原则。客户端-服务器约束&#xff08;Client-Server&#x…

基于STM32F030C8T6单片机实现与CH224Q诱骗芯片的I2C通信和电压输出配置

基于项目的需要,对STM32F030的IIC研究了几天,终于完成了通信,接下来具体实现如下: 本单片机使用的是PB8和PB9管脚进行实现,采用的是模拟的IIC进行 void MyI2C_W_SCL(uint8_t BitValue)//这三个函数将读写io口封装起来,增强可读性 { GPIO_WriteBit(GPIOB, GPIO_Pin_8…

TSMaster-C小程序使用

打开同星的TSMaster&#xff0c;推荐用32版本的&#xff0c;比64更稳定。同星的TSMaster的C小程序支持用户嵌入代码来控制CAN报文的收发逻辑。便于开发。点击设计里面的C小程序。 比如我现在想用小程序来实现继电器0先开后关开1s关1s&#xff0c;然后继电器1开1s关1s…如此往复…

XSS渗透测试原理/步骤/攻击方法/防御/常用语法

**核心概念回顾&#xff1a;**XSS漏洞一直被评估为web漏洞中危害较大的漏洞&#xff0c;在OWASP TOP10的排名中一直属于前三的江湖地位。XSS是一种发生在前端浏览器端的漏洞&#xff0c;所以其危害的对象也是前端用户。 形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处…

目标检测数据集 - 自动驾驶场景道路异常检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;自动驾驶场景道路异常检测数据集&#xff0c;真实场景高质量道路图片数据&#xff0c;涉及场景丰富&#xff0c;且类别丰富&#xff0c;划分为 "LMVs 轻型机动车&#xff08;汽车、摩托车、小型卡车、小型货车"、"HMVs 公交车、卡车、拖拉…

多模态新方向|从数据融合到场景落地,解锁视觉感知新范式

来gongzhonghao【图灵学术计算机论文辅导】&#xff0c;快速拿捏更多计算机SCI/CCF发文资讯&#xff5e;多模态学习&#xff08;Multimodal Learning&#xff09;是通过整合多种数据模态来提升模型对复杂场景感知与理解能力的技术&#xff0c;其核心是利用不同模态的互补性突破…

机器学习之随机森林

目录 一、什么是随机森林&#xff1f; 1. 从决策树到集成学习&#xff1a;为什么需要 "森林"&#xff1f; 2.什么是集成学习 二、随机森林的工作原理 三、随机森林构造过程 四、随机森林api介绍 五、随机森林的优缺点 六、垃圾邮件判断案例 1.数据集介绍 ​…

云平台运维工具 —— 阿里云原生工具

一、简介阿里云作为国内领先的云服务提供商&#xff0c;拥有一套完整的原生运维工具体系&#xff0c;这些工具与阿里云的各类服务深度融合&#xff0c;能够满足用户在资源部署、监控告警、权限管理、自动化运维等方面的需求。无论是简单的应用托管还是复杂的企业级架构&#xf…

Linux-Day10.系统安全保护web服务管理

今日目标&#xff1a;- 日志管理- 系统安全保护 SELinux&#xff08;重点&#xff09;- 构建基本web服务&#xff08;重点&#xff09;环境准备还原快照网络配置完成&#xff0c;开启虚拟机A与虚拟机B用真机连通虚拟机去操作&#xff0c;准本好Xshell一、常用的网络工具ip命令1…

解决:开启魔法后vscode pip命令不能安装中科大python镜像问题

闲言少叙&#xff0c;最终实现效果就是在开启魔法情况下&#xff0c;vscode命令行任何能通过中科大python镜像安装第三方库&#xff0c;又快又不消耗魔法流量。简单来说就两步&#x1f447;&#xff1a; 第一步&#xff1a;配置 pip.ini 中的代理 找到或创建 pip.ini 文件&…

优化Google Pubsub到GCS的文件整合策略

引言 在使用Google Cloud Platform (GCP) 的Pubsub服务时,我们常常会遇到将消息存储到Google Cloud Storage (GCS) 作为Avro文件的问题。本文将深入探讨如何优化Google Pubsub到GCS的文件整合策略,以避免每个消息都单独生成一个Avro文件,达到将多个消息整合到一个文件的目的…

基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真

基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真前言一、电机开环传递函数1.1 电机开环传递函数的零极点1.2 求系统的参数和绘制波特图二、增加PI控制器后系统开环传递函数三、电机系统闭环传递函数四、simulink仿真五、幅值裕度、相位裕度、相位穿越频率和截止频率&…

P1044 [NOIP 2003 普及组] 栈

P1044 [NOIP 2003 普及组] 栈 - 洛谷 题解来自洛谷题解&#xff0c;做笔记用 假设用一个函数来表示&#xff1a; x表示当前还未入栈的数字个数 y表示当前栈中的数字个数 orz&#xff0c;大佬们真的是很厉害&#xff0c;想着递推但是只拿了60分 #include <bits/stdc.h&g…

linux mysql 8.X主从复制

准备两台linux服务器,注意要锁ip我这里如上图 主库 192.168.5.5/24 从库 192.168.5.10/24 接下来确定mysql是否启动成功并且能从外部连接 主库从库主服务器配置 vim编辑主服务器配置 vim /etc/my.cnf注意是下面那个添加配置代码 log-binmysql-bin # 配置二进制日志 server-id1…

豆包新模型矩阵+PromptPilot:AI开发效率革命的终极方案

> **一套让AI开发者告别“调参炼狱”的黄金组合,效率提升300%的实战指南** ## 一、AI开发的范式转移:从通用模型到**场景化矩阵** 2025年,AI应用开发面临核心矛盾:**业务场景高度细分**与**模型能力同质化**的冲突。火山引擎的破局之道是推出**豆包1.6模型矩阵**——三…