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;
}