#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个合法,然后找规律*/