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

  

你可能感兴趣的:(children)