Sicily 1001 Alphacode

班别:计算机A班 学号:08380076 姓名:林榆耿 算法描述: 动态规划,要排除一些特殊的情况,具体的状态转移如下: 用F1 F2记录前次状态的count值 算出第一次和第二的count值,建立f1 f2两个值 进入循环(三种情况独立) 1. 若当前位为0,刚count值为前前状态的值 2. 若当前位与前一位能结合(指看作一个两位数是在11~26之间)则count值为f1+f2 3. 若当前位与前一位不能结合,则count值为f2 更新f1 f2的值。继续循环 #include<iostream> using namespace std; #include<string> int main() { string s; while(cin>>s&&s!="0") { long long count=0; long long f1=0,f2=0; int i; for( i=0;i<s.size();i++) { if(i==0) {f1=1;count=1;} if(i==1){ if((s[0]-'0')*10+s[1]-'0'<=26&&(s[0]-'0')*10+s[1]-'0'>10&&s[i]!='0'){f2=2;count=2;}else {f2=1;count=1;} } if(s[i]=='0'&&i>1) { count=f1; f1=f2; f2=count; } if(i>1&&s[i]!='0') { if((s[i-1]-'0')*10+s[i]-'0'<=26&&(s[i-1]-'0')*10+s[i]-'0'>10) { count=f2+f1; f1=f2; f2=count; } else{ count=f2; f1=f2; f2=count; } } } cout<<count<<endl; } return 0; }  

你可能感兴趣的:(算法,String)