您的位置:首页 > 其它

Sicily 1001 Alphacode

2010-07-06 13:07 405 查看
班别:计算机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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: