【条件递推】 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]);
         }
     }
}
posted @ 2020-09-21 16:13  Hyx'  阅读(101)  评论(0)    收藏  举报