1. 程式人生 > >(遞推 大整數) Children’s Queue hdu1297

(遞推 大整數) Children’s Queue hdu1297

code ted des stand hdu i++ tdi int total

Children’s Queue

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

Total Submission(s): 16006 Accepted Submission(s): 5337

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

1

2

3

Sample Output

1

2

4

對於各種排列而言,用f(n)表示其長度為n時的可能數,有以下的情形:

  長度為1時,只有1種可能,即“M”(女生不能單獨站立,下同);

  長度為2時,有2種可能,即“FF”和“MM”;

  長度為3時,有4種可能,即“FFF”、“FFM”、“MFF”和“MMM”;

  長度為

4時,有7種可能,即“FFFF”、“FFFM”、“FFMM”、“MFFM”、“MFFF”、“MMFF”、“MMMM”;

  長度為n>4時,對於之前長度n-1的排列,加一個M是可行的(最好是男孩的情形);對於之前長度n-2的排列,加加上FF是可行的(加MM有可能造成排列重復,這是最後是女孩的情形,並且前n-2個人是可行的排列);另外一種情況是,前n-2個人是不可行的排列,即最後的兩個人是“MF”,再加上兩個“FF”就變成可行的排列,這種情況也就是在n-4人可行的排列基礎上加上“MFFF”。

C++:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int s[1001][200];
int main()
{
    s[1][0]=1;
    s[2][0]=2;
    s[3][0]=4;
    s[4][0]=7;
    int i,j,c,ans=0;
    for(i=5;i<=1000;i++)
    {
        for(j=0,c=0;j<200;j++)
        {
            ans=s[i-1][j]+s[i-2][j]+s[i-4][j]+c;
            c=ans/100000000;
            s[i][j]=ans%100000000;
        }
    }
    int n;
    while(cin>>n)
    {
        j=199;
        while(!s[n][j])
            j--;
        cout<<s[n][j];
        for(i=j-1;i>=0;i--)
            printf("%08d",s[n][i]);
        cout<<endl;
    }
    return 0;
}

用JAVA

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner (System.in);
        BigInteger a[]=new BigInteger[1001];
        int n;
        while(in.hasNextInt()) {
            n=in.nextInt();
            a[1]=BigInteger.valueOf(1);
            a[2]=BigInteger.valueOf(2);
            a[3]=BigInteger.valueOf(4);
            a[4]=BigInteger.valueOf(7);
            for(int i=5;i<=n;i++) {
                a[i]=BigInteger.ZERO;
                a[i]=a[i].add(a[i-1]);
                a[i]=a[i].add(a[i-2]);
                a[i]=a[i].add(a[i-4]);
            }
            System.out.println(a[n]);
        }
    }
}

(遞推 大整數) Children’s Queue hdu1297