hdu1297Children’s Queue(递推+大数)

2014-11-24 02:34:48 · 作者: · 浏览: 1
题目链接:hdu1297
一个长度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]。
#include   
#include   
#include   
#include   
#include 
#include using namespace std; const int mod = 100000; int a[1003][50]; int main() { int n,i,j; a[1][1] = 1; a[2][1] = 2; a[3][1] = 4; a[4][1] = 7; for(i = 5; i <= 1000; i ++) { for(j = 1; j < 50; j ++) { a[i][j] += a[i-1][j] + a[i-2][j] + a[i-4][j]; a[i][j+1] += a[i][j]/mod; a[i][j] %= mod; } } while(~scanf("%d",&n)) { j = 49; while(!a[n][j]) j--; printf("%d",a[n][j]); for(--j; j >=1; j--) printf("%05d",a[n][j]); printf("\n"); } return 0; }