动态规划学习——数字转为字母

问题:

假设1对应A,2对应B,3对应C...26对应Z
现在给定一个数字串,求其可以转化为多少种字母串
如111可以转化为AAA,AK,KA

问题分析:

由于一共有26个英文字母,所以既可以一个数字对应一个字母,也可以两个数字对应一个字母。如11可以对应AA,也可以对应K。

所以对于每个数字都有两种情况,一是单独匹配一个字母,二是跟它后面的数字一起匹配一个字母。而只有数字小于等于26时,才能匹配到字母,所以还需添加一个判断条件。

另外,若当前数字为0,则不能匹配到字母,只有其与前面的数字组合时才有可能匹配到字母。

从左到右开始扫描数组,假定从下标为i开始到最后的结果数为result(i),即不考虑i前面的数字,则result(i)=result(i+1)+result(i+2),

代码:

#include<iostream>
using namespace std;char num[100000];
int len;
int ways2_temp[10000];//法一:直接递归
int ways1(int index)
{//如果到了数组的结尾,意味着匹配成功,返回1表示成功if(index==len) return 1;//如果目前数字串以0开头,则其没有匹配的字母,返回0表示失败if(num[index]=='0') return 0;//若目前数字串不以0开头,则有两种匹配情况//第一种情况:让目前第一个数字匹配字母int t=ways1(index+1);//第二种情况:让目前前两个数字匹配字母,但是只有这个两位数小于等于26时才能匹配到字母if(index+1<len&&((num[index]-'0')*10+num[index+1]-'0')<=26){ //这里要注意需要减去'0',因为因按照字符输入的,而不是数字t+=ways1(index+2);//若可以匹配,则总结果要加上第二种情况}return t;
}//法二:动态规划,将递归转化为数组即可
int ways2()
{ways2_temp[len]=1;//递归的出口,也是动态规划的起点int i;for(i=len-1;i>=0;i--){if(num[i]=='0') ways2_temp[i]=0;else{ways2_temp[i]=ways2_temp[i+1];if(i+1<len&&((num[i]-'0')*10+num[i+1]-'0')<=26) ways2_temp[i]+=ways2_temp[i+2];}}return ways2_temp[0];
}int main()
{int choice=0;//输入1则循环do{cout<<"请输入数组的长度"<<endl;cin>>len;int i;cout<<"请输入具体的数字"<<endl;for(i=0;i<len;i++) cin>>num[i];int result1=ways1(0);cout<<"法一 直接递归的结果为 "<<result1<<endl;int result2=ways2();cout<<"法二 动态规划的结果为 "<<result2<<endl;cout<<"继续请输入1"<<endl;cin>>choice;}while(choice==1);return 0;
}

对于动态规划代码的理解:

虽然这里的动态规划的代码是根据递归得出的,但是如果举几个例子看看其中规律,还是能发现它的道理。

这里再放一下动态规划的代码:

int ways2()
{ways2_temp[len]=1;//递归的出口,也是动态规划的起点int i;for(i=len-1;i>=0;i--){if(num[i]=='0') ways2_temp[i]=0;else{ways2_temp[i]=ways2_temp[i+1];if(i+1<len&&((num[i]-'0')*10+num[i+1]-'0')<=26) ways2_temp[i]+=ways2_temp[i+2];}}return ways2_temp[0];
}

可以看到,起始条件是ways2_temp[len]=1;

举例说明:

假设有数组[2,1,0,3,2],数组的长度为5

num[4]:[2]

ways2_temp[5]=1

ways2_temp[4]=ways2_temp[5]=1,这用常识来看是正确的,因为只考虑num[4]以后的数即[2],只有一种结果

num[3]:[3,2]

ways2_temp[4]=1

现在在前面加上一个数3,要判断32可以对应几种可能

又因为32>26,不能将其合并起来看,所以3和2只能单独对应一个字母,不满足代码中第二个if条件

按照代码,ways2_temp[3]=ways2_temp[4]=1,即32只对应一种可能

num[2]:[0,3,2]

由于num[2]=0,所以ways2_temp[2]=0,即无可以对应的字母

num[1]:[1,0,3,2]

此时1和0可以组合在一起,且必须组合在一起,因为如何不组合在一起,而让1独自匹配字母的话,后面的0会陷入尴尬的境地

对应到代码 ways2_temp[1]=ways2_temp[2]+ways2_temp[3]=0+1=1,这里0的含义是“1单独匹配时,后续数字匹配的可能数”,1的含义是“10组合时后续数字匹配的可能数”

num[0]:[2,1,0,3,2]

2单独匹配时,可能数为ways2_temp[1]

21组合时,可能数为ways2_temp[2]

所以最终结果为ways2_temp[1]+ways2_temp[2]=1

参考资料:

【应B友要求火速上线!算法大神(左程云)教你从暴力递归到动态规划,吊打所有暴力递归、动态规划问题】https://www.bilibili.com/video/BV1ET4y1U7T6?p=22&vd_source=4e9b7dd8105df854ae96830c97920252

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

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

相关文章

Java-NIO篇章(4)——Reactor反应器模式

前面已经讲过了Java-NIO中的三大核心组件Selector、Channel、Buffer&#xff0c;现在组件我们回了&#xff0c;但是如何实现一个超级高并发的socket网络通信程序呢&#xff1f;假设&#xff0c;我们只有一台内存为32G的Intel-i710八核的机器&#xff0c;如何实现同时2万个客户端…

openGauss学习笔记-206 openGauss 数据库运维-常见故障定位案例-too many clients already

文章目录 openGauss学习笔记-206 openGauss 数据库运维-常见故障定位案例-too many clients already206.1 高并发报错“too many clients already”或无法创建线程206.1.1 问题现象206.1.2 原因分析206.1.3 处理办法 openGauss学习笔记-206 openGauss 数据库运维-常见故障定位案…

143基于matlab的2D平面桁架有限元分析

基于matlab的2D平面桁架有限元分析&#xff0c;可以改变材料参数&#xff0c;输出平面结构外形&#xff0c;各桁架应力&#xff0c;位移及作用力。可查看节点力&#xff0c;程序已调通&#xff0c;可直接运行。 143 matlab 平面桁架 有限元分析 桁架应力 (xiaohongshu.com)

element-ui 树形控件 通过点击某个节点,遍历获取上级的所有父节点和本身节点

1、需求&#xff1a;点击树形控件的某个节点&#xff0c;需要拿到它上级的所有父节点进行操作 2、代码&#xff1a; 树形控件代码 <el-tree:data"deptOptions"node-click"getVisitCheckedNodes"ref"target_tree_Speech"node-key"id&qu…

prometheus监控RabbitMQ策略

一般用官方的rabbitmq_exporter采取数据即可&#xff0c;然后在普米配置。但如果rabbitmq节点的队列数超过了5000&#xff0c;往往rabbitmq_exporter就会瘫痪&#xff0c;因为rabbitmq_exporter采集的信息太多&#xff0c;尤其是那些队列的细节&#xff0c;所以队列多了&#x…

ubuntu下docker卸载和重新安装

卸载&#xff1a;步骤一&#xff1a;停止Docker服务 首先&#xff0c;我们需要停止正在运行的Docker服务。打开终端&#xff0c;执行以下命令&#xff1a; sudo systemctl stop docker 步骤二&#xff1a;删除Docker安装包 接下来&#xff0c;我们需要删除已经安装的Docker软件…

2024年美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

[云访谈]熊娟:要把钟煲煲打造成万店级连锁品牌

导读 众所周知&#xff0c;疫情后期餐饮行业的挑战加剧&#xff0c;市场上流传着这样一句话&#xff1a;“餐饮倒闭率达到百分百”。这意味着&#xff0c;在一条街上&#xff0c;可能每个店铺每年都要更换一次老板。 从宏观角度来看&#xff0c;疫情确实对餐饮业造成了重创。…

Qt‘s 撤销框架(Qt‘s Undo Framework)

一、开篇序言 我们常常有这样的业务场景,需要支持撤回的动作(即 undo)。如果让你来设计,聪明的你肯定也能立即想到解决问题的办法,对,将操作的 command { 对象,指令,属性 } 保存到一个容器中。 如果是仅需要单步撤销, 使用栈容器 保存command,动作执行即指令入栈, …

【服务器GPT+MJ+GPTs】创建部署GPT+MJ+GPTs程序网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建GPT+MJ+GPTs】 🌼1. 给服务器添加端口 🌼2. 安装宝塔 🌼3. 安装Docker 🌼4. 安装ChatGPT程序 🌼5. 程序更新 🌼6. 修改端口 | 密码 🌼7. 绑定域名+申请SSL证书 🌺【前言】 相信大家都对openai的产品ch…

JSON-handle工具安装及使用

目录 介绍下载安装简单操作 介绍 JSON-Handle 是一款非常好用的用于操作json的浏览器插件&#xff0c;对于开发人员和测试人员来说是一款很好用的工具&#xff0c;如果你还没有用过&#xff0c;请赶紧下载安装吧&#xff0c;下面是安装过程和具体使用。 下载安装 点击下载JSON…

Flink:快速掌握批处理数据源的创建方法

Flink 社区最近 “基于FLIP-27” 设计了新的 Source 框架 。一些连接器&#xff08;API&#xff09;已迁移到这个新框架。本文介绍了如何使用这个新框架创建批处理源。 它是在为Cassandra实现Flink 批处理源时构建的。如果您有兴趣贡献或迁移连接器&#xff0c;这篇文章非常适合…

2017年认证杯SPSSPRO杯数学建模D题(第二阶段)教室的合理设计全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 D题 教室的合理设计 原题再现&#xff1a; 某培训机构租用了一块如图&#xff08;见附件&#xff09;所示的场地&#xff0c;由于该机构开设了多种门类的课程&#xff0c;所以需要将这块场地通过加入一些隔墙来分割为多个独立的教室和活动区。…

sheng的学习笔记-神经网络

基础知识 基础知识-什么是分类问题 分类问题是根据已有数据&#xff0c;判断结果是正的还是负的&#xff08;1或者0&#xff09;,比如&#xff1a; • 根据肿瘤大小&#xff0c;判断肿瘤是良性的还是恶性的 • 根据客户交易行为&#xff0c;判断是否是恶意用户 • 根据邮件情况…

实习记录——第三天

今天还是去学习&#xff0c;昨天看另一个实习生有在了解ctf什么的&#xff0c;我就打算也看一看&#xff0c;问了问我的导师&#xff0c;他说我闲了可以看看&#xff0c;把我拉到了公司的ctf组&#xff0c;本来以为会是什么高大上的组织&#xff0c;结果好像就是平时分享分享知…

SAP EXCEL上传如何实现指定读取某一个sheet页(ALSM_EXCEL_TO_INTERNAL_TABLE)

如何读取指定的EXCEL sheet 页签&#xff0c;比如要读取下图中第二个输出sheet页签 具体实现方法如下&#xff1a; 拷贝标准的函数ALSM_EXCEL_TO_INTERNAL_TABLE封装成一个自定义函数ZCALSM_EXCEL_TO_INTERNAL_TABLE 在自定义函数导入参数页签新增一个参数SHEET_NAME 在源代码…

热门技术问答 | 请 GaussDB 用户查收

近年来&#xff0c;Navicat 与华为云 GaussDB 展开一系列技术合作&#xff0c;为 GaussDB 用户提供面向管理开发工具的生态工具。Navicat 现已完成 GaussDB 主备版&#xff08;单节点、多节点&#xff09;和分布式数据库的多项技术对接。Navicat 通过工具的流畅性和实用性&…

k8s 部署 Nginx 并代理到tomcat

一、已有信息 [rootmaster nginx]# kubectl get nodes -o wide [rootmaster nginx]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2…

前端各种优化

1&#xff1a;文件合并&#xff1a; 目的是减少 http 请求&#xff0c; 基本原理&#xff1a; 在浏览器(客户端)和服务器发生通信时&#xff0c;就已经消耗了大量的时间&#xff0c;尤其是在网络情况比较糟糕的时候&#xff0c;这个问题尤其的突出。 一个正常HTTP请求的流程简…

jQuery遍历(树遍历)

1、.children&#xff08;&#xff09;: 获得匹配元素集合中每个元素的直接子元素&#xff0c;选择器选择性筛选。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script src"jQuery.js"&g…