[sicily] 1001. Alphacode

這裏寫圖片描述

題目大意:
假設有一規則:’A’ 設爲1,’B’設爲2,以此類推, ‘Z’設爲26。按照這個規則給一串英文字母編碼,將會得到一個數字碼。現在給定這個數字碼,求出可以解碼出多少種不同的英文字母。

解題思路
動態規劃:由於總共有26個英文字母,那麼數字碼可能取1~26。那麼對於每一個數字,這個數字可以單獨解碼,也可以與其前面一個數字一起解碼。則得到的解碼規則如下:

以下每種情況,初始時,結果 = 0。
1. 若數字碼只有一位,結果 = 1。

2.若數字碼有兩位,
1> 如果後一個數字在 ‘1’ ~ ‘9’之間,那麼 結果 += 1。
2 >如果這兩個數字組成的數字在 ‘10’ ~ ‘26’ 之間,那麼結果 += 1。

3.如果數字碼位數大於3, 假設去掉最後一個數字得到的結果是a,去掉最後兩個數字得到的結果是b,那麼:
— 如果後一個數字在 ‘1’ ~ ‘9’之間,那麼 結果 += a。
— 如果這兩個數字組成的數字在 ‘10’ ~ ‘26’ 之間,那麼結果 += b。
(剛開始的時候,我以爲應該是結果 = 結果(0) + a + 1,和 結果 = 結果 + b + 1。其實不用加1的原因是,在計算a的時候,就已經隱式的將最後一個數字碼看成是單獨一個字母了;同樣在計算b的時候,也已經隱式的將最後兩個數字碼看成是一個字母了。)

最終的代碼如下

#include <iostream>
#include <string>

using namespace std;

string s;

int main(int argc, char const *argv[])
{
    while (cin >> s && s[0] != '0')
    {
        int result[10000] = {1, 1};
        int len = s.length();
        for (int i = 1; i < len; ++i)
        {
            if (s[i] >= '1' && s[i] <= '9')
                result[i + 1] += result[i];
            if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] <= '6')) //last-two-digit is between '10' and '26'
                result[i + 1] += result[i - 1];
        }
        cout << result[len] << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章