【条件递推】 Children's queue
传送门
题意
给定\(n\)个人,其中队列中只能没有女生或者出现的女生都至少连续两个,即单独一个女生不合法,
求所有的可能排列的数量,\(M\)表示男生,\(F\)表示女生
数据范围
\(1\leq n\leq 1000\)
题解
用\(f_{n}\)表示前\(n\)种的合法序列的数量
- \(n=1\),\(M\)合法,共\(1\)种
- \(n=2\),\(FF、MM\)合法共\(2\)种
- \(n=3\),\(MMM、FFF、FFM、MFF\)合法共\(4\)种
- \(n=4\),\(MMMM、FFFF、MFFF、FFFM、FFMM、MMFF、MFFM\)合法共\(7\)种
- 当\(n>4\)的时候,在\(f_{n-1}\)后面加一个\(M\)合法
- 当\(n>4\)的时候,在\(f_{n-2}\)后面加\(FF\)合法
- 当\(n>4\)的时候,当前\(n-2\)种不合法且最后两个是\(MF\)时候加上\(FF\)就合法了等价于\(f_{n-4}\)加上\(MFFF\)
只有这种情况的不合法序列可以改造成合法序列,所以保证了所有状态的遍历。
得到\(n>4\)的递推公式为
\[f_{n}=f_{n-1}+f_{n-2}+f_{n-4}
\]
Code
//package com.company;
import java.math.BigInteger;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
BigInteger f[]=new BigInteger[10000];
f[1]=BigInteger.valueOf(1);
f[2]=BigInteger.valueOf(2);
f[3]=BigInteger.valueOf(4);
f[4]=BigInteger.valueOf(7);
for (int i = 5; i < 10000; i++) {
f[i] = f[i-1].add(f[i-2]).add(f[i-4]);
}
while(in.hasNext()){
int n=in.nextInt();
System.out.println(f[n]);
}
}
}

浙公网安备 33010602011771号