斐波那契数列应用在字符串分割组合上的算法题

来源:互联网 发布:小怪兽 知乎 编辑:程序博客网 时间: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 wordBEAN’ 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 getBEAAD’, YAAD',YAN’, YKD' andBEKD’. 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这个字符串走一遍代码就明白了。其实就是斐波那契数列而已。

原创粉丝点击