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

news2024/12/26 23:28:15

目录

动态规划怎么学?

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

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

相关文章

国内流行的数据可视化软件工具

在信息爆炸的时代&#xff0c;越来越多的数据堆积如山。但是&#xff0c;这些密集的数据没有重点且可读性较差。因此&#xff0c;我们需要数据可视化来帮助数据易于理解和接受。相比之下&#xff0c;可视化更直观、更有意义&#xff0c;使用适当的数据可视化工具来可视化数据非…

C++入门 - 1(几分钟让你快速入门C++)

c入门 1. C关键字(C98)2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4.缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰(name Mangling)提问&#xff1a;C语言中为什么没有函数重载呢&#xff1f; …

常见的网络拓扑结构,你都看懂吗

常见的网络拓扑结构有以下6种&#xff1a;1.总线型网络拓扑结构&#xff1b;2.星型网络拓扑结构&#xff1b;3.环形网络拓扑结构&#xff1b;4.树型网络拓扑结构&#xff1b;5.网状网络拓扑结构&#xff1b;6.混合网络型拓扑结构。其中&#xff0c;“总线型网络拓扑结构”是所有…

Redis学习(三)持久化机制、分布式缓存、多级缓存、Redis实战经验

文章目录 分布式缓存Redis持久化RDB持久化AOF持久化 Redis主从Redis数据同步原理全量同步增量同步 Redis哨兵哨兵的作用和原理sentinel&#xff08;哨兵&#xff09;的三个作用是什么&#xff1f;sentinel如何判断一个Redis实例是否健康&#xff1f;master出现故障后&#xff0…

QT中级(7)- 串口工具

QT中级&#xff08;7&#xff09;- 串口工具 1 串口通信的基础知识2 需要准备的工具3 Qt中的串口编程3.1 引入QSerialPort3.2 设置参数3.3 读取数据3.4 发送数据 4 源码 1 串口通信的基础知识 串行与并行&#xff1a;串口通信是一种串行通信方式。这意味着数据一位一位地通过通…

面试中关于自动化测试的认识

目录 一、什么是自动化测试&#xff0c;自动化测试的优势是什么&#xff1f; 二、什么样的项目比较适合做自动化测试&#xff0c;什么样的不适合做自动化测试&#xff1f; 三、在制定自动化测试计划的时候一般要考虑哪些点&#xff1f; 四、编写自动化脚本时的一些规范&…

02. 第一个Docker部署应用

目录 1、前言 2、Docker部署Nginx 3、修改镜像存储路径 3.1、默认存储路径 3.2、自定义存储路径 3.2.1、创建自定义的镜像存储路径 3.2.2、创建Docker守护进程的配置文件 3.2.3、重启docker服务 3.2.4、重新查看docker路径 4、配置镜像加速 4.1、配置阿里镜像加速器…

Unity 之 安卓平台上架隐私问题解决方案

Unity 之 助力游戏增长 -- 解决隐私问题 一&#xff0c;平台测试隐私问题二&#xff0c;解决方式一2.1 勾选自定义Mainifest2.2 修改自定义Mainifest2.3 隐私协议弹窗逻辑 三&#xff0c;解决方式二3.1 导出安卓工程3.2 创建上层Activity3.3 配置AndroidManifest 四&#xff0…

SOMEIP协议----第一节(概述)

SOMEIP协议 概述 1.什么是SOME/IP? SOME/IP: 如上图所述,连起来就是基于车载以太网技术的面向服务的可扩展中间件 汽车某ECU软件算法如果需要和其他ECU交互,大部分都通过跨ECU之间的服务来实现,即可以通过车载以太网异步调用其他ECU上的服务,应用开发者只需要关注服务…

携带时间戳主动写入数据到prometheus service

使用到的github公开项目 https://github.com/castai/promwrite 拉下来装依赖&#xff0c;然后使用 client_test.go t.Run(“write with custom options”, func(t *testing.T) 这个测试用例里面&#xff0c;删掉srv初始化的部分&#xff0c;这个是模拟一个客户端&#xff0c;直…

MySQL数据备份与恢复

目录 ​编辑 一、数据备份 1.1物理备份 1.1.1冷备份 1.1.2热备份 1.1.3温备份 二、逻辑分区 2.1完全分区 2.2差异分区 2.3增量备份 三、数据备份恢复实验 3.1做一个数据 3.2物理冷备份与恢复 3.3mysqldump 备份与恢复&#xff08;温备份&#xff09; 3.4Mysql数据…

mmdetection3.1.0 训练自己的数据集

目录 前言安装mmcv安装mmdetection验证安装数据集转为COCO划分训练集、验证集及测试集安装PaddlePaddle安装PaddleX划分数据集 修改对应文件修改coco.py重新安装修改模型文件 训练测试测试带真值的图像测试不带真值的图像批量测试 错误集锦ValueError: need at least one array…

设计模式 ~ 发布订阅者

发表订阅者模式 用于实现对象之间的松耦合通信&#xff1b; 在该模式中&#xff0c;存在一个或多个发布者&#xff08;Publishers&#xff09;和一个或多个订阅者&#xff08;Subscribers&#xff09;&#xff1b; 发布者负责发布消息&#xff0c;而订阅者负责订阅感兴趣的消息…

C++中的“三重”

博文内容&#xff1a;重载、重定义&#xff08;隐藏&#xff09;&#xff0c;重写&#xff08;覆盖&#xff09; 三重区别及联系 概念联系及区别1、作用域2、函数要求 概念 重载 函数名相同,函数的参数列表不同(包括参数个数和参数类型)&#xff0c;至于返回类型可同可不同。 …

如何应对黑产进行验证图片资源遍历

第一期&#xff0c;我们分享的攻防点是&#xff1a;验证图片资源遍历。 “遍历”指黑产通过穷举法获得所有验证码图片的答案&#xff0c;以便能在未来彻底无视验证码。由于验证码主要是通过图片语义答案来识别人机&#xff0c;因此攻破这层防御最有效的方式就是遍历该验证码图…

【电路原理学习笔记】第4章:能量与功率:4.4 能量转换与电阻的电压降

第4章&#xff1a;能量与功率 4.4 能量转换与电阻的电压降 图4-11以电子作为电荷进行举例说明&#xff0c;电子从电池的负极流过电路&#xff0c;然后流回正极。当它们从负极出来时&#xff0c;电子具有最高的能量水平。电子流经过每个电阻&#xff0c;这些电阻连接在一起形成…

微信要怎么定时自动发布朋友圈呢?

大家都知道&#xff0c;朋友圈营销在当今十分重要。对于那些做了私域的人来说&#xff0c;他们知道这可以给自己带来多少的收益。最近&#xff0c;很多客户都纷纷向我咨询朋友圈发圈的问题。客户们认为朋友圈多号操作很费事&#xff0c;拥有多个号容易漏发&#xff1b;若看到同…

【Ceph集群应用】Ceph对象存储系统之RGW接口详解

Ceph对象存储系统之RGW接口详解 1.创建Ceph对象存储系统RGW接口2. 开启httphttps,更改监听端口3. 更改监听端口4.S3接口访问测试5.实验中遇到的故障案例 接上文基于ceph-deploy部署Ceph集群详解 1.创建Ceph对象存储系统RGW接口 &#xff08;1&#xff09;对象存储概念 对象存…

【C语言】杨氏矩阵中寻找元素

题目名称&#xff1a; 杨氏矩阵 题目内容&#xff1a; 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从下到上递增的&#xff08;杨氏矩阵的定义&#xff09;&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 形如这样的矩阵就是杨氏…

基于51单片机和proteus的八路抢答器系统

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. 分别采集八路抢答器按键输入信号和系统按键信号。 2. 检测到按键输入后蜂鸣器发出提示音。 3. 数码管显示八路中首次按下的按键。 4. 重置按键可重置系统&#xff0c;重新抢答。 功能框图如下…