【动态规划算法】第四题:91.解码方法

news2024/10/5 16:31:28

💖作者:小树苗渴望变成参天大树
🎉作者宣言:认真写好每一篇博客
🎊作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法
在这里插入图片描述
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言


前言

今天我们开始讲解动态规划的第四题,博主认为再理解方面比第三题简单,但是代码方便些起来比前面的细节更多一些,因为初始化和前面的有所差别,最后再讲解一下优化问题,我们开始进入正文


第四个题目是解码方法
在这里插入图片描述
我们来看图解解析:
在这里插入图片描述
对于题解,题目说的非常清楚了,有具体案例,上面图解讲解了特性,一会些状态转移方程需要用到

通过动态规划的五个步骤解题:

  1. 状态表示:经验+题目要求:以i位置为结尾,dp[i]表示:当字符串有i个的时候,dp[i]为可以解码的总数
    在这里插入图片描述
  2. 状态转移方程
    根据题目要求,以i位置为结尾,最近的状态来分析
    在这里插入图片描述

当s[i] 上的数在 [1, 9] 区间上时: dp[i] += dp[i - 1] ;
当s[i - 1] 与s[i] 上的数结合后,在[10, 26] 之间的时候: dp[i] +=
dp[i - 2]

  1. 初始化:保证数组不越界出现i-1,i-2,将dp[0],dp[1]初始化即可
    在这里插入图片描述
  2. 填表顺序:从左往右
  3. 返回值:根据题目要求,根据伊卡斯hi的图解,字符串后面还有一个\0,大小为n,实际有效字符有n个,所以dp[n-1]才是返回解码总数

代码实现:

class Solution {
public:
    int numDecodings(string s) {
            //1.创建dp表
            //2.初始化
            //3.填表
            //4.返回值
            int n=s.size();
            vector<int> dp(n);
            dp[0]=s[0]!='0';//非空字符串
            if(n==1)return dp[0];

            if(s[0]!='0'&&s[1]!='0')dp[1]+=1;//单独解码初始化
            int t=(s[0]-'0')*10+s[1]-'0';
            if(t>=10&&t<=26)dp[1]+=1;//两个组合解码初始化

            for(int i=2;i<n;i++)
            {
            	//两者各自成功的时候+1,分开算。失败的时候就不用算进来了。
                if(s[i]!='0')dp[i]+=dp[i-1];
                int t=(s[i-1]-'0')*10+s[i]-'0';
                if(t>=10&&t<=26)dp[i]+=dp[i-2];
            }
            return dp[n-1];
     }
 }

优化: 大家应该发现我们的初始化和循环里面的代码几乎一样,那我们怎么解决这样的问题呢??我们就要再初始化上做动作:

在这里插入图片描述

这种方法也叫处理边界及初始化问题:这题不太还理解的,博主也是想了半天才理解了.

优化后的代码:

class Solution {
public:
   int numDecodings(string s) {
  			int n=s.size();
            vector<int> dp(n+1);
            dp[0]=1;
            dp[1]=s[1-1]!='0';//方便理解下标对应
            for(int i=2;i<=n;i++)
            {
                if(s[i-1]!='0')dp[i]+=dp[i-1];
                int t=(s[i-2]-'0')*10+s[i-1]-'0';
                if(t>=10&&t<=26)dp[i]+=dp[i-2];
            }
            return dp[n];
    }
};

大家可以对比没有优化后的代码

运行结果:
在这里插入图片描述

今天我们的动态规划第四题就将到这里了,大家下去好好理解一下,我们下题再见在这里插入图片描述

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

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

相关文章

一建建筑周超口袋书

第一部分 建筑工程技术1A414000 建筑工程材料[B-4,2021] 常见的高分子防水卷材有哪些?三元乙丙、聚氯乙烯、氯化聚乙烯、氯化聚乙烯-橡胶共混及三元丁橡胶防水卷材记忆技巧三单数年考试中&#xff0c;2011 年屋面女儿墙渗漏水处理&#xff0c;2015 年女儿墙防水识图找错&#…

element ui table 状态用switch展示

效果图如下 方法一&#xff1a;将图片封装成组件 1.&#xff1a;ImgswitchOpen.vue 2&#xff1a;页面引入组件 3&#xff1a;使用 方法二&#xff1a;引入图片 1&#xff1a;引入图片 2&#xff1a;在data中定义 3.使用

垂直领域大模型:从医疗ChatDoctor到金融BloombergGPT、法律ChatLaw/LawGPT_zh

第一部分 各种医疗类ChatGPT&#xff1a;或中英文数据微调LLaMA、或中文数据微调ChatGLM 1.1 基于LLaMA微调的中英文版ChatDoctor 1.1.1 ChatDoctor&#xff1a;通过self-instruct技术提示API的数据和医患对话数据集微调LLaMA Github上有一个基于LLaMA模型的医疗微调模型&am…

c++高性能264/265实时h5流媒体服务器前后端整体解决方案

c高性能264/265实时h5流媒体服务器前后端整体解决方案 1.效果展示 下图展示了前端播放效果。 播放1路264视频流&#xff0c;4路265视频流 CPU占用率10%(测试机器上运行着c服务端和其他工具程序) GPU0占用率17% 1.1 作者测试机器配置 处理器 11th Gen Intel Core™ i7-118…

如何确定适合网站的长尾关键词?

确定适合网站的长尾关键词&#xff0c;需要进行以下几个步骤&#xff1a; 1. 目标受众分析&#xff1a;首先&#xff0c;要确定网站的目标受众是谁。了解目标受众的特点和需求&#xff0c;可以帮助我们选择适合他们的长尾关键词。例如&#xff0c;如果目标受众是学生&#xff…

【Linux | Shell命令】Linux 环境变量

目录 一、概述二、什么是环境变量2.1 全局环境变量2.2 局部环境变量 三、设置用户自定义变量3.1 设置局部用户自定义变量3.2 设置全局环境变量3.3 删除环境变量 四、默认的 shell 环境变量五、5.1 设置 PATH 环境变量5.2 一、概述 Linux 系统中&#xff0c;很多程序和脚本通过环…

爱创科技携腾讯云拓展海内外药械数字溯源服务,“一物一码”全程可追踪

想象一下&#xff0c;当每个人从医院取药窗口或药房买到关乎自己生命健康的药品时&#xff0c;只需掏出手机打开微信&#xff0c;扫一扫药盒上的二维码&#xff0c;就可以看到药品真伪、出厂厂家、用药科普等信息&#xff0c;既带来一份用药的安心&#xff0c;也能清晰地看到医…

二进制、十进制相互转换

二进制转十进制&#xff1a; 1100 0000转为十进制的数值为&#xff1a;12864192 十进制转二进制&#xff1a; 列如&#xff1a;十进制数为202 1286432168421二进制11001010 解析&#xff1a; 202>128&#xff0c;第一个二进制数为&#xff1a;1 202-128>64&#xf…

服务器垃圾怎样清理?C盘垃圾如何清理?

好多人都在问电脑垃圾如何清理&#xff1f;服务器的垃圾清理是系统维护中必不可少的一项任务&#xff0c;而C盘垃圾的清理同样也是必须要做的任务之一。那么&#xff0c;如何一键清理服务器垃圾&#xff0c;C盘垃圾如何清理呢&#xff1f;今天&#xff0c;我会以服务器助手为例…

8、架构:服务端介绍

作为一个产品化的项目&#xff0c;就必然有服务端的支持&#xff0c;这次的项目我们依然使用与上一本小册一样的技术栈 NestJS作为产品的服务端开发语言。 服务端的内容对于常规的前端开发会比较难上手&#xff0c;因为除了服务端的开发语言之外&#xff0c;我们还需要安装各种…

如何查看docker File!!!!

1.如何查看dockerfile&#xff01; 先docker images 查看所有的镜像&#xff0c;然后再一个目录下先创建一个脚本&#xff0c;把下面内容复制进去 #!/bin/bash export PATH$PATH if [ $# -eq 1 ];thendocker history --format {{.CreatedBy}} --no-trunctrue $1 |sed "s…

基于PyQt5的桌面图像调试仿真平台开发(6)去马赛克

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

c++ connect函数连接失败 解决方法

bool Connect() {//初始化网络WSADATA wsadata;WSAStartup(MAKEWORD(2, 2), &wsadata);if (0 ! WSAStartup(MAKEWORD(2, 2), &wsadata))return false;if (LOBYTE(wsadata.wVersion) ! 2 ||HIBYTE(wsadata.wVersion) ! 2) {printf("请求协议版本失败!\n");ret…

12.JavaWeb-Node.js+创建Vue项目

1.Node.js的概念 传统的Web服务器中&#xff0c;每个请求都会创建一个线程&#xff0c;这会导致线程数的增加&#xff0c;从而影响服务器的性能和扩展性&#xff0c;Ryan Dahl借助Chrome的V8引擎提供的能力实现了Node.js——可以在服务端运行的JavaScript&#xff08;可以把Nod…

SQL-每日一题【197.上升的温度】

题目 表&#xff1a; Weather 编写一个 SQL 查询&#xff0c;来查找与之前&#xff08;昨天的&#xff09;日期相比温度更高的所有日期的 id 。 返回结果 不要求顺序 。 查询结果格式如下例。 示例 1&#xff1a; 解题思路 前置知识 交叉连接(CROSS JOIN) 即笛卡尔积&…

Vue Router 的params和query传参的使用和区别

//$router : 是路由操作对象&#xff0c;只写对象 //$route : 路由信息对象&#xff0c;只读对象//操作 路由跳转 this.$router.push({name:hello,params:{name:word,age:11} })//读取 路由参数接收 this.name this.$route.params.name; this.age this.$route.params.age; 1…

ADS笔记,时域和频域绘图

为防止遗忘&#xff0c;记录一下ADS的时间域和频谱图的绘制 在ADS中想得到电路的时域和频域图的话&#xff0c;可以用谐波平衡仿真HB或者选择一个准瞬态仿真控制器插入到原理图中来实现。 目录 方法一&#xff1a;谐波平衡仿真HB时域设置频域设置 方法二&#xff1a;准瞬态仿…

【Linux】git三板斧教程(免密提交配置)

git 什么是git&#xff1f;Linux下安装git基于git的一些商业网站介绍在gitee上创建仓库注册账号创建项目将仓库克隆到本地 git三板斧git三板斧第一招&#xff1a;git add三板斧第二招&#xff1a;git commit三板斧第三招&#xff1a;git push git免密码提交git log查看提交日志…

通俗易懂的期权入门知识汇总,硅铁期权即将上市适合用那种期权策略管理风险

【1】期权&#xff1a;是指某一标的物的买卖权或选择权。具有在某一限定时期内按某一指定的价格买进或卖出某一特定商品或合约的权利。这种权利是买进者拥有的一种权利&#xff0c;并非一种义务 【2】保证金&#xff1a;为确保执行&#xff0c;期权卖方存入的担保金 【3】多头…

Python flask入门教程(flask教程)(轻量级Web框架)

文章目录 flask能做什么&#xff1f;1. 路由和视图函数2. 模板引擎3. 表单处理4. 数据库集成5. 用户认证和授权6. 文件上传和下载7. RESTful API开发拓展&#xff1a;什么是RESTful API开发 8. 扩展性9. 轻量级和灵活性总结 flask入门1. 安装Flask2. 创建Flask应用3. 定义路由和…