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

  

posted @ 2011-08-16 21:24  wutaoKeen  阅读(292)  评论(0编辑  收藏  举报