Sicily 1001. Alphacode
【题意】
给一串数,这一串数可以解码为若干英文字母的组合,比如‘1’对应‘A’,‘26’对应‘Z’,输入保证是合法的,不会出现说有解码不了的情况,求这一串数可以解释为多少种英文字母的组合。
【思路】
动态规划思想,如果当前字符为‘0’,则dp[i]=dp[i-2],如果当前字符不为‘0’,且与前面的数字组合能构成英文字母,那么dp[i]=dp[i-1]+dp[i-2]。这两种情况中,i=1的时候另外处理。本来不难的题目,因为和前一个字母进行判断的时候条件写错了,纠结了很久……
1 #include<iostream> 2 #include<cstring> 3 #include<memory.h> 4 using namespace std; 5 int main() 6 { 7 string s; 8 while(cin>>s && s!="0") 9 { 10 int l = s.length(); 11 long dp[l]; 12 memset(dp,0,sizeof(dp)); 13 dp[0] = 1; 14 for(int i = 1; i < l; i++) 15 { 16 if(s[i] == '0') 17 { 18 if(i ==1) 19 dp[i] = dp[i-1]; 20 else 21 dp[i] = dp[i-2]; 22 } 23 else 24 { 25 26 if((s[i-1] == '1' && s[i] <= '9') || (s[i-1] == '2' && s[i]<='6')) 27 { 28 if(i != 1) 29 dp[i] = dp[i-1] + dp[i-2]; 30 else 31 dp[i] = dp[i-1] + 1; 32 } 33 else 34 dp[i] = dp[i-1]; 35 } 36 37 } 38 cout<<dp[l-1]<<endl; 39 } 40 // system("pause"); 41 }