题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1865
1sting
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6849 Accepted Submission(s): 2662
Problem Description
You will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ‘2’, or leave the ‘1’ there. Surly, you may get many different results. For example, given 1111 , you can get 1111, 121, 112,211,22. Now, your work is to find the total number of result you can get.
Input
The first line is a number n refers to the number of test cases. Then n lines follows, each line has a string made up of ‘1’ . The maximum length of the sequence is 200.
Output
The output contain n lines, each line output the number of result you can get .
Sample Input
3 1 11 11111
Sample Output
1 2 8
Author
z.jt
Source
Recommend
lcy | We have carefully selected several similar problems for you: 1715 1250 1133 2100 1753
一道规律题,列举多项后,发现时斐波那契数列,不过要用到大数加法,数据很大
ac代码如下:
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
string add(string s1,string s2){
int len,lmax,lmin;
string max,min;
max=s1; min=s2;
lmax=max.length(); lmin=min.length();
len=lmax-1;
for(int i=lmin-1;i>=0;i--,len--){
max[len]+=min[i]-'0';
}
for(int i=lmax-1;i>=1;i--)
if(max[i]>'9'){
max[i-1]++;
max[i]-=10;
}
if(max[0]>'9'){
max[0]-=10;
max='1'+max;
}
return max;
}
int main(){
string ans[205];
ans[0]='0'; ans[1]='1'; ans[2]='2';
for(int i=3;i<=200;i++)
ans[i]=add(ans[i-1],ans[i-2]);
int t;
cin>>t;
while(t--){
char str[205];
scanf("%s",str);
int len=strlen(str);
cout<<ans[len]<<endl;
}
return 0;
}