【HDOJ】1297 Children’s Queue
递推,最近发现自己做递推的题总是没有思路。下周多练习。
对于f(n)可以在第n个位置为男生,此时共有f(n-1)种情况;若在第n个位置为女生,因此第n-1个位置也必须为女生。此时有两种情况,一种情况是在f(n-2)后直接添加FF,另一种情况是在MF后添加FF将本来错误的串改为正确的,这种情况数量为f(n-4)(前n-4排列满足要求)。因此,f(n) = f(n-1) + f(n-2) + f(n-4)。题目数据超过64位,大数AC。
1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXLEN 1200 5 #define MAXNUM 1002 6 7 char buf[MAXNUM][MAXLEN]; 8 9 int main() { 10 int i, j; 11 12 memset(buf, 0, sizeof(buf)); 13 buf[1][0] = 1; 14 buf[2][0] = 2; 15 buf[3][0] = 4; 16 buf[4][0] = 7; 17 18 for (i=5; i<MAXNUM; ++i) { 19 for (j=0; j<MAXLEN; ++j) { 20 buf[i][j] += buf[i-1][j] + buf[i-2][j] + buf[i-4][j]; 21 buf[i][j+1] += buf[i][j] / 10; 22 buf[i][j] %= 10; 23 } 24 } 25 26 while (scanf("%d", &i) != EOF) { 27 j = MAXLEN; 28 while (buf[i][--j] == 0) 29 /*nop*/ ; 30 for (;j>=0; --j) 31 printf("%d", buf[i][j]); 32 printf("\n"); 33 } 34 35 return 0; 36 }