Hdu 1297 Children’s Queue

http://acm.hdu.edu.cn/showproblem.php?pid=1297

 

2010040920023490.png

2010040920275550.png

在合法序列后面加上一个M,或两个FF,序列仍然合法。

在不合法序列后面加上FF,成为合法, 其实加一个F也能构成合法,但是这种情况包含在第一种里面;

所以递推方程式d[n] =d[n-1] + d[n-2] + d[n-4];

d[i] 中保存的都是合法序列数。

 

 

 
  
1 // Accepted 1297 15MS 628K 836 B C++ SuperBin
2   // d[i] = d[i-1] + d[i-2] + d[i-4];
3   #include < stdio.h >
4 #include < string .h >
5   #define max(x,y) ((x)>(y)?(x):(y))
6   #define EP 100000000
7   #define NL 1001
8   #define NLL 100
9
10   // 打表保存1000以内的结果
11   // d[i][0]保存大整数的位数,d[i][1] 保存最低位
12   // 每八位存储一个单元
13   int d[NL][NLL];
14
15   // 计算d[k1] + d[k2], 结果保存在d[k0]中
16   void add( int k1, int k2, int k0)
17 {
18 int L;
19 int i;
20 int x, y;
21 L = max(d[k1][ 0 ], d[k2][ 0 ]);
22 y = 0 ;
23 for (i = 1 ; i <= L; i ++ ) {
24 x = d[k1][i] + d[k2][i] + y;
25 d[k0][i] = x % EP;
26 y = x / EP;
27 }
28 if (y > 0 ) {
29 d[k0][ ++ L] = y;
30 }
31 d[k0][ 0 ] = L;
32 }
33
34
35   int main()
36 {
37 int i, len;
38 int n;
39 memset(d, 0 , sizeof (d));
40 d[ 1 ][ 0 ] = d[ 2 ][ 0 ] = d[ 3 ][ 0 ] = d[ 4 ][ 0 ] = 1 ;
41 d[ 1 ][ 1 ] = 1 ;
42 d[ 2 ][ 1 ] = 2 ;
43 d[ 3 ][ 1 ] = 4 ;
44 d[ 4 ][ 1 ] = 7 ;
45 for (i = 5 ; i < NL; i ++ ) {
46 add(i - 1 , i - 2 , 0 );
47 add( 0 , i - 4 , i);
48 }
49 while (scanf( " %d " , & n) != EOF) {
50 len = d[n][ 0 ];
51 printf( " %d " , d[n][len]);
52 for (i = len - 1 ; i >= 1 ; i -- )
53 printf( " %08d " , d[n][i]);
54 printf( " \n " );
55 }
56 return 0 ;
57 }

 

 


  

转载于:https://www.cnblogs.com/superbin/archive/2010/04/09/1708600.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值