HDU 1865

来源:互联网 发布:地震安全知识网络竞赛 编辑:程序博客网 时间:2024/06/15 21:41

1sting

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4190    Accepted Submission(s): 1584


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
311111111
 

Sample Output
12

8

观察规律 其实就是斐波那契数列 只是要考虑大数情况

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int d[202][3000]={0};int num[202]={0};int main(){    d[1][1]=1;    d[2][1]=2;    num[1]=num[2]=1;for(int i=3;i<=200;i++){int k=0;int j=0;for(j=1;j<=num[i-1];j++){d[i][j]=d[i-1][j]+d[i-2][j]+k;k=d[i][j]/10;d[i][j]%=10;}if(k){d[i][j]=k;num[i]=j;}else{num[i]=j-1;}} int t=0; int n=0; char x[202]; scanf("%d",&t); getchar(); while(t--) { scanf("%s",&x); n=strlen(x); for(int i=num[n];i>=1;i--) { printf("%d",d[n][i]); } printf("\n"); }return 0;}

0 0
原创粉丝点击