1sting
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4154 Accepted Submission(s): 1562
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
嗯,题目大意就是一串以1组成的字符串,每两个1可以替换成一个2,问一个串可以有多少种写法。
多写几个算一下,就可以看出来是Fibonacci数列,只不过这个不能直接用一位数组打表存数据了,字符串最长200,需要用大数加法了
#include<cstdio>
#include<cstring>
char s[300];
int va[300][300];
void dabiao()
{
int i,j;
memset(va,0,sizeof(va));
va[1][0]=1;
va[2][0]=2;
for(i=3;i<201;++i)
{
for(j=0;j<=200;++j)
{
va[i][j]=va[i][j]+va[i-1][j]+va[i-2][j];
if(va[i][j]>=10)
{
va[i][j]-=10;
va[i][j+1]+=1;
}
}
}
}
int main()
{
int n,i,len;
scanf("%d",&n);
dabiao();
while(n--)
{
scanf("%s",s);
len=strlen(s);
i=200;
while(va[len][i]==0)i--;
for(;i>=0;i--)printf("%d",va[len][i]);
printf("\n");
}
return 0;
}