0
点赞
收藏
分享

微信扫一扫

hdu 1865 1sting


1sting


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


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


import java.util.*;
import java.math.*;
public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
BigInteger[] num=new BigInteger [220];
num[1]=new BigInteger("1");
num[2]=new BigInteger("2");
for(int i=3; i<=200; i++){
num[i]=num[i-1].add(num[i-2]);
}
//String []str=new String[1010];
int m,n=in.nextInt();
while(n>0){
String str=in.next();
m=str.length();
System.out.println(num[m]);
n--;
}
}

}



使用大数的常规解法,AC: 
#include<cstdio>
#include<cstring>
int a[202][300];
void f(int len)
{
a[1][0]=1;
a[2][0]=2;
int d=1,ans=0,i,j,c;
for(i=3; i<=len; i++)
{
c=0;
for(j=0;j<d; j++)
{
ans = a[i-2][j]+a[i-1][j]+c;
a[i][j]=ans%10;
c=ans/10;
}
while(c)
{
a[i][d++] = c%10;
c/=10;
}
}
}
int main()
{
int n,len,i,j;
char s[202];
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
len = strlen(s);
f(len);
j=300;
while(a[len][j]==0)
{
j--;
}
for(i=j; i>=0; i--)
{
printf("%d",a[len][i]);
}
printf("\n");
}
return 0;
}


用数组的第二维存储多位一直超时,不知道什么原因。 
超时代码:
#include<cstdio>
#include<cstring>
int a[202][10000];
void f(int len){
int i,j,c,d,ans;
memset(a,0,sizeof(a));
a[1][0]=1;
a[2][0]=2;
for(i=3,d=1; i<=len; i++){
c=0;
for(j=0; j<d; j++){
ans=a[i-1][j]+a[i-2][j]+c;
a[i][j]=ans%10000;
c=ans/10000;
}
while(c){
a[i][d++] =c%10000;
c/=10000;
}
}
j = d;
while(a[len][j]==0){
j--;
}
printf("%d",a[len][j]);
for(i=j-1; i>=0; i--)
printf("%04d",a[len][i]);
printf("\n");
}

int main(){
int n,len,i,j;
char s[202];
scanf("%d",&n);
while(n--){
scanf("%s",s);
len=strlen(s);
f(len);
}
return 0;
}




举报

相关推荐

0 条评论