您的位置:首页 > 其它

hdoj 1865 1sting

2015-07-27 17:54 169 查看

1sting

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 4157 Accepted Submission(s): 1564



[align=left]Problem Description[/align]
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.

[align=left]Input[/align]
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.

[align=left]Output[/align]
The output contain n lines, each line output the number of result you can get .

[align=left]Sample Input[/align]

3
1
11
11111


[align=left]Sample Output[/align]

1
2
8  思路:这是一道大数题,规律是斐波那契,因为要两个数相加,将这两个数都放到数组中去,因为有l=strlen(s)个数,所以用二维数组记录。  代码: [code]#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int num[300][1000];
char s[1000];
int main()
{
int i,n,l,len,k,j;
scanf("%d",&n);

while(n--)
{
scanf("%s",s);
l=strlen(s);
memset(num,0,sizeof(num));
num[1][1]=1;num[2][1]=2;
len=1;
for(i=3;i<=l;i++)
{
for(k=1;k<=len;k++)
{
num[i][k]=num[i][k]+num[i-1][k]+num[i-2][k];
if(num[i][k]>9)
{
num[i][k+1]+=num[i][k]/10;
num[i][k]%=10;
}
if(num[i][len+1])
{
len++;
}

}
}
for(i=len;i>=1;i--)
{
printf("%c",num[l][i]+'0');
}
printf("\n");
}
return 0;
}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: