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

  

转载于:https://www.cnblogs.com/bo-tao/archive/2011/08/16/2141530.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值