Problem B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 181 Accepted Submission(s): 39
Problem Description
度熊面前有一个全是由1构成的字符串,被称为全1序列。你可以合并任意相邻的两个1,从而形成一个新的序列。对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列。
Input
这里包括多组测试数据,每组测试数据包含一个正整数 N,代表全1序列的长度。1≤N≤200
Output
对于每组测试数据,输出一个整数,代表由题目中所给定的全1序列所能形成的新序列的数量。
Sample Input
1 3 5
Sample Output
1 3 8
Hint
如果序列是:(111)。可以构造出如下三个新序列:(111), (21), (12)。
Source
题解:
相邻两个数可以合并,问题可以转化为,由1和2组成序列数和为N的种数;可以想着枚举2的个数;每次组合数找到k个2的组成个数
组合数;一看果断组合数:
#include#include #include #include #include using namespace std;__int64 C[210][210];void init(){ C[1][0] = C[1][1] = 1; for(int i = 2; i <= 200; i++){ C[i][0] = C[i][i] = 1; for(int j = 1; j < i; j++){ C[i][j] = C[i - 1][j] + C[i - 1][j - 1]; } } }int main(){ int N; init(); while(~scanf("%d", &N)){ __int64 ans = 0; for(int i = 0; i <= N/2; i++){ ans += C[i + N - 2 * i][i]; } printf("%I64d\n", ans); } return 0;}
但是组合数太大,大数,所以用java过;
代码:
import java.math.BigInteger;import java.util.Scanner;public class 百度之星B { static BigInteger[][] C = new BigInteger[210][210]; static void init(){ C[1][0] = new BigInteger("1"); C[1][1] = new BigInteger("1"); for(int i = 2; i <= 200; i++){ C[i][0] = new BigInteger("1"); C[i][i] = new BigInteger("1"); for(int j = 1; j < i; j++){ C[i][j] = C[i - 1][j].add(C[i - 1][j - 1]); } } } public static void main(String[] args){ Scanner cin = new Scanner(System.in); init(); while(cin.hasNext()){ int N = cin.nextInt(); BigInteger ans = new BigInteger("0"); for(int i = 0; i <= N/2; i++){ ans = ans.add(C[i + N - 2 * i][i]); } System.out.println(ans); } }}