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; }