斐波那契数列应用在字符串分割组合上的算法题
来源:互联网 发布:小怪兽 知乎 编辑:程序博客网 时间:2024/05/18 01:37
一个可以应用斐波那契数列来简单求解的算法题
Description
Alice and Bob need to send secret messages to each other and are discussing ways to encode their messages: Alice: “Let’s just use a very simple code: We’ll assign A' the code word 1,
B’ will be 2, and so on down to Z' being assigned 26." Bob: "That's a stupid code, Alice. Suppose I send you the word
BEAN’ encoded as 25114. You could decode that in many different ways!” Alice: “Sure you could, but what words would you get? Other than BEAN', you'd get
BEAAD’, YAAD',
YAN’, YKD' and
BEKD’. I think you would be able to figure out the correct decoding. And why would you send me the word `BEAN’ anyway?” Bob: “OK, maybe that’s a bad example, but I bet you that if you got a string of length 500 there would be tons of different decodings and with that many you would find at least two different ones that would make sense.” Alice: “How many different decodings?” Bob: “Jillions!” For some reason, Alice is still unconvinced by Bob’s argument, so she requires a program that will determine how many decodings there can be for a given string using her code.
Input
Input will consist of multiple input sets. Each set will consist of a single line of digits representing a valid encryption (for example, no line will begin with a 0). There will be no spaces between the digits. An input line of `0’ will terminate the input and should not be processed
Output
For each input set, output the number of possible decodings for the input string. All answers will be within the range of a long variable.
Sample Input
25114
1111111111
3333333333
0
Sample Output
6
89
1
解题代码:
#include <iostream>#include <string>using namespace std;int main(){ string s; while( cin>>s && s!="0") { int a,b=1,c=1; for(int i =1;i<s.length();i++){ a = b; b = c; c = 0; if(s[i-1]=='1'||(s[i-1]=='2'&&s[i]<='6'))c+=a; if(s[i]<='9'&&s[i]>='1')c+=b; } cout << c <<endl; } }
思路:
初始化结果为0.
(1)当字符串长度为1时,结果为1;
(2)当字符串长度为2时:
1*若最后俩个字符为‘10’-‘26’中的一个时,结果+=1;
2*若最后一个字符为‘1’-‘9’中的一个时,结果+=1;
(3)当字符串长度大于等于3时,在逐个遍历字符的情况下,设除去当前访问的两个字符之前的字符组合数为a,除去当前的一个字符之前的字符组合数为b,有:
1*:考虑两个字符,若为‘10’-‘26’中的一个时,结果+=a;
2*:考虑一个字符,若为‘1’-‘9’中的一个时,结果+=b;
自己用121212这个字符串走一遍代码就明白了。其实就是斐波那契数列而已。
- 斐波那契数列应用在字符串分割组合上的算法题
- 【水题算法】斐波那契数列的应用
- 算法应用-斐波那契数列
- 斐波那契数列的应用(算法实现)
- 斐波那契数列的应用
- 一道有关斐波那契数列的算法题
- 306. Additive Number 给定字符串分割进行类似斐波那契数列
- 斐波那契数列的小应用
- HDU5620——斐波那契数列的应用
- 关于斐波那契数列的性质及其应用
- HDU5620 斐波那契数列的应用 思维 规律
- 常见斐波那契数列的性质及其应用
- P1349 广义斐波那契数列(矩阵的应用)
- 斐波那契数列及其应用
- “斐波那契数列”问题的递推算法
- 关于斐波那契数列的算法比较
- 斐波那契数列的算法比较
- “斐波那契数列”问题的递推算法
- 待解决的问题
- tomcat启动startup.bat一闪而过
- grub2中 load 模块的过程
- java学习——java基础(一)之概念解析
- C++复习第三天 运算符重载
- 斐波那契数列应用在字符串分割组合上的算法题
- 配置PropertiesEditor插件 jp.gr.java_conf.ussiy.app.propedit_5.3.3
- 自动创建docker容器脚本
- linux select 多路复用机制
- 代码干货 | Python高性能计算库——Numba
- 编程范式16 笔记 信号量
- MySQL安装图解设置详细教程
- wpf命令详解
- 'find' and 'locate' in linux to look up files