题目:


Children’s Queue

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

Total Submission(s): 853 Accepted Submission(s): 479

 

Problem Description


There are many students in PHT School. One day, the headmaster whose name is PigHeader wanted all students stand in a line. He prescribed that girl can not be in single. In other words, either no girl in the queue or more than one girl stands side by side. The case n=4 (n is the number of children) is like
FFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMM
Here F stands for a girl and M stands for a boy. The total number of queue satisfied the headmaster’s needs is 7. Can you make a program to find the total number of queue with n children?


 

Input


There are multiple cases in this problem and ended by the EOF. In each case, there is only one integer n means the number of children (1<=n<=1000)


 

Output


For each test case, there is only one integer means the number of queue satisfied the headmaster’s needs.


 

Sample Input



123



 

Sample Output



124



 

Author


SmallBeer (CML)


 

Source


杭电ACM集训队训练赛(VIII)


 

Recommend


lcy



题目分析:

一个长度n的队列可以看成一个n - 1的队列再追加的1个小孩,这个小孩只可能是:

a.男孩,任何n - 1的合法队列追加1个男孩必然是合法的,情况数为f[n - 1];

b.女孩,在前n - 1的以女孩为末尾的队列后追加1位女孩也是合法的,我们可以转化为n - 2的队列中追加2位女孩;

一种情况是在n - 2的合法队列中追加2位女孩,情况数为f[n - 2];但我们注意到本题的难点,可能前n - 2位以女孩为末尾的不合法队列(即单纯以1位女孩结尾),也可以追加2位女孩成为合法队列,而这种n - 2不合法队列必然是由n - 4合法队列+1男孩+1女孩的结构,即情况数为f[n - 4]。

因为这道题的n已经达到1000了,而且又是“累加”这种计算模型,所以果断使用java的大数来做



代码如下:


import java.math.BigInteger;
import java.util.Scanner;


public class Main {

	public final static int maxn = 1001;
	static BigInteger dp[] = new BigInteger[maxn];
	
	public static void prepare(){
		dp[1] = BigInteger.valueOf(1);
		dp[2] = BigInteger.valueOf(2);
		dp[3] = BigInteger.valueOf(4);
		dp[4] = BigInteger.valueOf(7);
		
		int i;
		for(i = 5 ; i < maxn ; ++i){
			dp[i] = new BigInteger("0");
			dp[i] = dp[i].add( dp[i-1]).add( dp[i-2]).add( dp[i-4]);
		}
	}
	
	public static void main(String[] args) {
		prepare();
		
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()){
			int n = scanner.nextInt();
			
			System.out.println(dp[n]);
		}
	}
}