HDU 1297 Children’s Queue

来源:互联网 发布:centos yum 网卡驱动 编辑:程序博客网 时间:2024/06/06 03:30

题意:
有n个人站成一排,其中女生不能单独一个人站,男生:M、女生:F。就不能有例如:FM, MF, MFM这样的排列存在,问有多少种站队的方法。
思路:
其实也是一个递推。
f[i]代表排列i个人的合法序列。

f[i] = f[i - 1] + f[i - 2] + f[i - 4]//i >= 5

1.在 i - 1合法序列后面加一个男生是合法的。
2.在以F结尾的 i - 1 合法序列后面加一个F也是合法的,而且以F为结尾的 i - 1 合法序列的个数可以转化为 i - 2合法序列的个数。(因为所有以F为结尾的i - 1合法序列都是从 i - 2合法序列的全体加上一个F得到的)。
3.而一个不合法的序列也可以通过添加两个M变成合法序列(为什么不加一个M,因为会造成重复,比如FMM,就可以通过FM + M,还可以通过f[i - 2]),而这种不合法的序列只有这一种形式是可以的:(合法序列) + M + F。
Code:

import java.math.BigInteger;import java.util.Scanner;public class Main{    static int N = (int) (1e3 + 5);    static BigInteger[] f = new BigInteger[N];    public static void main(String args[])    {        Scanner cin = new Scanner(System.in);        f[1] = bv(1);        f[2] = bv(2);        f[3] = bv(4);        f[4] = bv(7);        for(int i = 5; i <= 1000; ++i)        {            f[i] = f[i - 1].add(f[i - 2]).add(f[i - 4]);        }        while(cin.hasNext())        {            int n = cin.nextInt();            println(f[n]);        }    }    public static void println(Object o)    {        System.out.println(o);    }    public static BigInteger bv(int n)    {        return BigInteger.valueOf(n);    }}
0 0