HDU 1297 Children’s Queue
#include<stdio.h> #include<stdlib.h> int num[1024][300]={0}; int main() { int n; num[0][1]=1;num[1][1]=1;num[2][1]=2;num[3][1]=4; for( int i=4; i<=1000; i++ ) { for( int j=1;j<300; j++ ) { num[i][j]+=num[i-1][j]+num[i-2][j]+num[i-4][j]; num[i][j+1]=num[i][j]/10; num[i][j]%=10; } } while( scanf( "%d",&n )!=EOF ) { int i=299; while( num[n][i]==0 ) i--; for( int j=i;j>=1;j-- ) printf( "%d",num[n][j] ); puts( "" ); } return 0; } /*【分析】 此题为递推求解。 f[n]表示n个人的合法队列 讨论最后一个人。 1、最后一个人是男。则对n-1个人的队列没有任何限制,故共f[n-1]; 2、最后一个人是女。 (1)前n-1个人的队列合法。共f[n-2]; (2)前n-1个人的队列不合法。只有一种情况:前n-4个人的队列合法,第n-3个人为男,第n-2个人为女。共f[n-4]; 故,f[n]=f[n-1]+f[n-2]+f[n-4]. 考虑到数据比较大。 故使用高精度。 【总结】 递推求解分类要全面。 一般假设前n-1个合法,然后找规律*/