【学会动态规划】解码方法(4)

目录

动态规划怎么学?

1. 题目解析

2. 算法原理

1. 状态表示

2. 状态转移方程

3. 初始化

4. 填表顺序

5. 返回值

3. 代码编写

写在最后:


动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

这道题目不难理解,就是根据题目给的字符串的数字,

然后解码成字母有多少种情况,然后注意有前导零的数字不能解码。 

2. 算法原理

1. 状态表示

这道题目的状态表示其实就是,

dp[ i ] 位置代表什么,而 dp[ i ] 位置代表的是到第 i 个位置的时候解码方法的总数是多少?

2. 状态转移方程

状态表达式的求解方法就是根据最近的一步划分问题,

我们来分析一下,dp[ i ] 有两种解码方法,

1. s[ i ] 单独解码,如果是单独解码,当 s[ i ] 的值是 1~9 的时候可以自己解码,

自己解码的方案数就是 dp[ i - 1 ],如果 s[ i ] 的值是 0,那方案数就是0,整体解码失败,

2. s[ i ] 和 s[ i - 1 ] 一起解码,当 s[ i  - 1 ] * 10 + s[ i ] 的值是 10~26 的时候就可以解码,

而解码数就是 dp[ i - 2 ],如果解码失败,不在这个区间内,那方案数就也是0。

所以我们可以得出转态转移方程大体是:

dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] (根据上面的方案数判断规则)

3. 初始化

初始化就是防止填表的时候越界,

而我们的状态转移方程需要用到 dp[ i - 1 ] 和 dp[ i - 2 ],

所以我们要初始化 dp[ 0 ] 和 dp[ 1 ] 位置,

dp[ 0 ] 位置,如果s[ 0 ] 解码成功就是1,不成功就是0

dp[ 1 ] 位置,如果 dp[ 1 ] 能自己解码,就 + 1,如果能跟 dp[ 0 ] 一起解码,就再 + 1,

如果dp[ 1 ] 两种情况都不能解码,就是0。(所以可能是0,  1,  2)  

4. 填表顺序

填表顺序还是从左往右。

5. 返回值

返回值就是字符串最后一个位置的方案数,dp[ s.size() - 1 ]。

3. 代码编写

class Solution {
public:int numDecodings(string s) {// 创建dp表int size = s.size();vector<int> dp(size);// 初始化dp[0] = s[0] != '0';if(size == 1) return dp[0];if(s[0] != '0' && s[1] != '0') dp[1]++;int tmp = (s[0] - '0') * 10 + (s[1] - '0');if(tmp >= 10 && tmp <= 26) dp[1]++;for(int i = 2; i < size; i++) {if(s[i] != '0') dp[i] += dp[i - 1]; // 单独解码tmp = (s[i - 1] - '0') * 10 + (s[i] - '0');if(tmp >= 10 && tmp <= 26) dp[i] += dp[i - 2]; // 和前面联合解码}return dp[size - 1];}
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

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

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

相关文章

跟我一起从零开始学python(九)numpy+pandas+matplotlib

前言 回顾之前讲了python语法编程 &#xff0c;必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;后续讲到了数据库编程篇MySQL&#xff0c;Redis&#xff0c;MongoDB篇&#xff0c;和机器学习&#xff0c;全栈开发前面没看的也不用往前翻&#…

macos使用搭建算法竞赛c/c++的g++/gcc编译环境(homebrew,含万能头,改环境变量,vscode/clion可用)

文章目录 1、homebrew安装2、安装g3、改环境变量 1、homebrew安装 我没改镜像&#xff0c;直接网上脚本一键安装的&#xff0c;具体命令忘了&#xff0c;可能是这个 反正装这个的方法很多&#xff0c;网上一搜都有。 成功装上homebrew就行。 /bin/bash -c "$(curl -fsSL…

Acwing.905 区间选点(贪心)

题目 给定N个闭区间[a,bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数N&#xff0c;表示区间数。 接下来N行&#xff0c;每行包含两个整数…

【QT】元对象系统学习笔记(一)

QT元对象系统 01、元对象系统1.1、 元对象运行原则1.2、 Q_OBJECT宏1.3、 Qt Creator启动元对象系统1.4、 命令行启动元对象&#xff08;不常用&#xff09; 02、反射机制2.1、 Qt实现反射机制2.2、 反射机制获取类中成员函数的信息2.1.1、 QMetaMethon类2.1.2、QMetaObject类 …

如何快速又高质量的输出PDF实验报告?

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 PDF文档的打印在很多应用场景中都会被使用到&#xff0c;最为常见的就是实验室信息管理…

xred病毒分析

概述 xred病毒是一种感染型病毒&#xff0c;会感染系统中特定目录下的exe和xlsx文件&#xff0c;该病毒会将自身伪装成Synaptics触摸板驱动程序&#xff0c;使用Dephi编写。 样本的基本信息 Verified: Unsigned Link date: 6:22 1992/6/20 Company: Synaptics Description: S…

华南农业大学|图像处理与分析技术综合设计|题目解答:定位数显区域并分离电表数字

设计任务 图 28 是一幅正在运行的数字电表图像&#xff08;ipa28.jpg&#xff09;&#xff0c;试采用图像处理与分析 技术&#xff0c;设计适当的算法和程序&#xff0c;找出电表的数显区域&#xff0c;计算目标区域的长宽比 和像素面积&#xff1b;并提取其中面积最大的 …

Service:微服务架构的应对之道

Service 的工作原理和 LVS、Nginx 差不多&#xff0c;Kubernetes 会给它分配一个静态 IP 地址&#xff0c;然后它再去自动管理、维护后面动态变化的 Pod 集合&#xff0c;当客户端访问 Service&#xff0c;它就根据某种策略&#xff0c;把流量转发给后面的某个 Pod。 Service 使…

Docker把公共镜像推送到harbor私服的流程(企业级)

如果构建项目时&#xff0c;使用了k8s docker Jenkins的模式。 那么我们在docker构建镜像时&#xff0c;如果需要使用了Nodejs&#xff0c;那么我们必须得从某个资源库中拉取需要的Nodejs。 在企业里&#xff0c;正常都会把自己项目涉及的库都放在harbor私服里。 下面讲一下&…

珠海电子行业实行MES系统该如何规划 mes系统供应商 先达盈致

在电子行业中&#xff0c;MES系统是提高生产效率、降低成本、优化生产计划的关键工具。但是&#xff0c;如何规划MES系统的实施才能使其大限度地提高企业的生产效率和经济效益呢&#xff1f; 首先&#xff0c;企业应该充分了解MES系统的基本概念和功能模块。MES系统中包括生产…

PowerDesigner 数据库建模使用详解

目录 一、前言 二、PowerDesigner概述 2.1 PowerDesigner核心能力 2.1.1 集成多种建模能力 2.1.2 自动生产代码能力 2.1.3 强大的逆向工程能力 2.1.4 可扩展的企业库解决方案 2.2 PowerDesigner常用的几种模型 2.2.1 概念模型 2.2.2 逻辑数据模型 2.2.3 物理模型 2.2…

华为云CodeArts Check IDE插件体验之旅

1 开发者的思考 近年来&#xff0c;ChatGPT的来临像一场突然出现的风暴&#xff0c;程序员是否马上被取代的担忧出现在媒体上了&#xff0c;作为软件开发小白&#xff0c;前不久我也陷入了这样的深思之中&#xff0c;但认真的想了下&#xff0c;ChatGPT就如自动驾驶一样&#…