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 }                                 
posted @ 2012-07-17 15:14  mrlaker  阅读(1744)  评论(0编辑  收藏  举报