hdu 1297 Children’s Queue

这个题目也是递推,但是比较有意思的是要涉及到高精度

递推式:f[i]=f[i-1]+f[i-2]+f[i-4]

思路:1、i-1个排好了,只能再加一个F,共f[i-1]种

2、i-2个排好了,a、可以加两个F;b、可以加两个M,但是两个F跟第一种冲突了,所以有f[i-2]种

3、i-4个排好了,有FFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMM这么多种,其中最后是M的跟第一种冲突,最后是FF的跟第二种冲突,只剩FFFF了,所以有f[i-4]种

  至于高精度处理看高精度模板,至于数据存储需要灵活处理

   题目传送门

 1 #include<stdio.h>
 2 #include<string.h>
 3 int f[1001][300]={{1,1},{1,1},{1,2},{1,4}};
 4 void add(int *p,int *q,int *sum)
 5 {
 6     int len,i;
 7     if(q[0]<p[0]) len=p[0];
 8     else len=q[0];
 9     for(i=1;i<=len;i++)
10     {
11         sum[i]+=q[i]+p[i];
12         if(sum[i]>9){sum[i]-=10;sum[i+1]++;}
13     }
14     if(sum[i]>0)len++;
15     sum[0]=len;
16 }
17 int main()
18 {
19     int i,n,ss[300];
20     for(i=4;i<1001;i++)
21     {
22         memset(ss,0,sizeof(ss));
23         add(f[i-1],f[i-2],ss);
24         add(ss,f[i-4],f[i]);
25     }
26     while(scanf("%d",&n)!=EOF)
27     {
28         for(i=f[n][0];i>0;i--)
29             printf("%d",f[n][i]);
30         printf("\n");
31     }
32     return 0;
33 }

 

posted @ 2013-05-10 14:06  飞向梦  阅读(143)  评论(0编辑  收藏  举报