现在的位置: 首页 > 综合 > 正文

hdu 1865 1sting

2018年05月02日 ⁄ 综合 ⁄ 共 2003字 ⁄ 字号 评论关闭

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;
} 

抱歉!评论已关闭.