【题意】
给一串数,这一串数可以解码为若干英文字母的组合,比如‘1’对应‘A’,‘26’对应‘Z’,输入保证是合法的,不会出现说有解码不了的情况,求这一串数可以解释为多少种英文字母的组合。
【思路】
动态规划思想,如果当前字符为‘0’,则dp[i]=dp[i-2],如果当前字符不为‘0’,且与前面的数字组合能构成英文字母,那么dp[i]=dp[i-1]+dp[i-2]。这两种情况中,i=1的时候另外处理。本来不难的题目,因为和前一个字母进行判断的时候条件写错了,纠结了很久……
1 #include2 #include 3 #include 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 else21 dp[i] = dp[i-2];22 }23 else24 {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 else31 dp[i] = dp[i-1] + 1;32 }33 else34 dp[i] = dp[i-1];35 }36 37 }38 cout< <