博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sicily.1001. Alphacode
阅读量:5289 次
发布时间:2019-06-14

本文共 1160 字,大约阅读时间需要 3 分钟。

  这题用到的是动态规划算法。主要的思想和分治法有点像,将大大的问题分解成底层的小问题,动态规划就是把问题从最小的单元开始,逐渐增加问题规模,每次后面的结果都与前面相关。我咬字不清,下面就结合这个题目来讲解吧。

  问题输入的是一串数字1~26(A~Z),求解可以形成多少种字符串。我们首先不要拿一大窜字符来考虑,我们想的思路是:先取1个数字,一种排法;第2个数字,可能与第1个数字结合,或者单独成字母;第3个数字,可能与第2个数字结合,或者单独成字母。。。。思路就是这样了。

  每个新增加的字母有三种可能出现的情况(用pre代表前一个数字,post代表新增数字):

为了讲解方便,我们为每个数字设计了一个数组s,每个数字都代表相应的数组的值,代表新增这个数字时,整个字符串形成的种类。post为s2。

  ①“pre+post”形成的数字大于26,则post只能单独成字母,此时的字符串种数和前一个相同。则s2=s1。

  ②“pre+post”形成的数字在1~26之间,此时有两种选择,单独成字母或者与前一个结合。单独成字母时,其字符串种数和前一个相同;与前一个结合时,其种数与前前个的种树相同。总的种数为前两个字母的种类数之和。则s2=s1+s0.

  ③“post=0”,此时只能形成“10”,一次它的种类数只能为前前个字母的种类数。则s2=s0。

具体代码如下:

1 // Problem#: 1001 2 // Submission#: 1448210 3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License 4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ 5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University 6 #include 
7 #include
8 using namespace std; 9 10 int main()11 {12 string str;13 while(cin>>str&&str!="0")14 {15 int s1=1,s2=1,s3=1;16 for(int i=1;i

转载于:https://www.cnblogs.com/lfwllq/archive/2012/06/30/2570845.html

你可能感兴趣的文章
力扣——由斜杠划分区域
查看>>
java如何使用帮助文档api
查看>>
ajax 请求另一个html页面的指定的一部分 加载到本页面div
查看>>
java.sql.SQLException: 对只转发结果集的无效操作: last
查看>>
独立思考者模型:如何科学地思考 掌握更正确的思维方式
查看>>
配置Eclipse 3.3 + tomcat 6.0 + lomboz 3.3进行Web开发
查看>>
【原版的】无锁编程与实现
查看>>
windows 7 SDK和DDK下载地址
查看>>
採訪The Molasses Flood:BioShock Infinite 游戏之后又一大作
查看>>
oninput,onpropertychange,onchange的使用方法和差别
查看>>
C#单进程能保持多少客户端连接之2
查看>>
论get和post的区别。。
查看>>
[bzoj1101] [POI2007]Zap
查看>>
线程与进程&&线程私有资源
查看>>
pku1218 THE DRUNK JAILER
查看>>
WSE 3.0 文档翻译:安装WSE3.0
查看>>
Resource Management in View Controllers
查看>>
19. 斐波那契数
查看>>
php文件夹与文件目录操作函数
查看>>
变量的直接赋值和间接赋值
查看>>