Problem B
Accepts: 1131
Submissions: 4378
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
度熊面前有一个全是由1构成的字符串,被称为全1序列。你可以合并任意相邻的两个1,从而形成一个新的序列。对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列。
Input
这里包括多组测试数据,每组测试数据包含一个正整数 N ,代表全1序列的长度。 1≤N≤200
Output
对于每组测试数据,输出一个整数,代表由题目中所给定的全1序列所能形成的新序列的数量。
Sample Input
1
3
5
Sample Output
1 3 8Hint如果序列是:(111)。可以构造出如下三个新序列:(111), (21), (12)。题解:手动推一下,就是斐波那契数列。。。。注意n太大就要高精度。。。于是用了C++之后转了Java。。。、AC代码:/* WA的版本.... n越大就超过——int64了.... */ #include<iostream> #include<memory.h> #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<cstdlib> #include<iomanip> #include<vector> #include<list> #include<map> #include<algorithm> typedef long long LL; using namespace std; LL dp[210]; int main() { int n; dp[1]=1; dp[2]=2; for(int i=3;i<=201;i++) { dp[i]=dp[i-1]+dp[i-2]; } while(~scanf("%d",&n)) { if(n==0)printf("\n"); else printf("%I64d\n",dp[n]); } return 0; } //java版本:AC import java.util.Scanner; import java.math.BigInteger; public class Main { public static BigInteger[]dp=new BigInteger[205]; public static void main(String[] args) { Scanner cin=new Scanner(System.in); Init(); while(cin.hasNext()) { int n=cin.nextInt(); if(n>=1&&n<=200) { System.out.print(dp[n]); } System.out.println(); //当n=0时,输出换行,坑啊 } } public static void Init() { dp[1]=new BigInteger("1"); dp[2]=new BigInteger("2"); for(int i=3;i<=201;i++) { dp[i]=dp[i-1].add(dp[i-2]); } } }