Sicily: 101.Alphacode

Sicily: 101.Alphacode

動態規劃問題。求一串字母轉爲數字的字符串有多少種解密方法。與斐波那契數列有點像,但是多了幾個條件而已。動態轉移方程如下:

動態轉移方程

if(( array[ i - 1 ] == '1' && array[ i ] <= '9' ) || ( array[ i - 1 ] == '2' && array[ i ] <= '6' ))//i和i-1組合有意義,分開有意義
    dp[i]=dp[i-1]+dp[i-2];
else if(array[i] > '6' || array[i-1] == '0')//i和i-1組合無意義,分開有意義
    dp[i]=dp[i-1];
else if(array[i] == '0')//i和i-1組合有意義,分開無意義
    dp[i]=dp[i-2];

其中第三個判斷array[i]是否爲0是一個要注意的點,因爲密碼總是正確的,那麼0之前只能是‘1’或者是‘2’,無論是哪一種,都只能有一種解密方法,所以dp[i]=dp[i-2]。算是題目比較特殊的地方。

代碼

#include <iostream>  
#include <string>  
using namespace std;  

int main()  
{  
    int i;  
    string s;  
    int dp[ 3 ];  

    while ( cin >> s && s != "0" ) {  
        dp[ 0 ] = dp[ 1 ] = dp[ 2 ] = 1;  
        for ( i = 1; i < s.size(); i++ ) {  
            dp[ 0 ] = dp[ 1 ];  
            dp[ 1 ] = dp[ 2 ];  
            if ( s[ i ] == '0' )  
                dp[ 2 ] = dp[ 0 ];  
            else if ( ( s[ i - 1 ] == '1' && s[ i ] <= '9' ) || ( s[ i - 1 ] == '2' && s[ i ] <= '6' ) )  
                dp[ d ] = dp[ 0 ] + dp[ 1 ];  
            else  
                num[ 2 ] = num[ 1 ];  
        }  
        cout << num[ 2 ] << endl;  
    }  

    return 0;  

}   
發佈了27 篇原創文章 · 獲贊 0 · 訪問量 7952
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章