hdu-1297

来源:互联网 发布:androidstudio源码网 编辑:程序博客网 时间:2024/05/18 03:09

思路如下:

一个长度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]。

递推公式:f[n]= f[n -1]+ f[n -2]+ f[n -4]

#include<stdio.h> #define base 10000int main(){     int n;     int f[1001][101] = {0};     f[0][0] = 1;     f[1][0] = 1;     f[2][0] = 2;    f[3][0] = 4;     for(int i = 4; i < 1001; ++i)        for(int j = 0; j+1 < 101; ++j)        {             f[i][j] += f[i - 1][j] + f[i - 2][j] + f[i - 4][j];            if(f[i][j]>=base)            {                f[i][j + 1] += f[i][j] / base;                 f[i][j] %= base;            }        }     while(scanf("%d", &n) != EOF)    {         int k = 100;         while(!f[n][k--]);         printf("%d", f[n][k + 1]);         for(; k >= 0; --k)            printf("%04d", f[n][k]);          printf("\n");     }     return 0; }