hdu1297 Children’s Queue (动态规划,n个人排成一列的方案数+高精加)

来源:互联网 发布:吴达洙 知乎 编辑:程序博客网 时间:2024/06/03 17:57

Children’s Queue

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12548    Accepted Submission(s): 4110


Problem Description
There are many students in PHT School. One day, the headmaster whose name is PigHeader wanted all students stand in a line. He prescribed that girl can not be in single. In other words, either no girl in the queue or more than one girl stands side by side. The case n=4 (n is the number of children) is like
FFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMM
Here F stands for a girl and M stands for a boy. The total number of queue satisfied the headmaster’s needs is 7. Can you make a program to find the total number of queue with n children?
 

Input
There are multiple cases in this problem and ended by the EOF. In each case, there is only one integer n means the number of children (1<=n<=1000)
 

Output
For each test case, there is only one integer means the number of queue satisfied the headmaster’s needs.
 

Sample Input
123
 

Sample Output
124
 

Author
SmallBeer (CML)
 

Source
杭电ACM集训队训练赛(VIII)
 

Recommend
lcy   |   We have carefully selected several similar problems for you:  1465 1133 1480 1438 1466 
 


解析:f[i] 表示队列长度为 i 时的方案数,则:f[i]=f[i-1]+f[i-2]+f[i-4]

           1.f[i-1]:最后一个为男生,前 i-1 个合法

           2.f[i-2]:最后一个为女生,那么前一个必为女生,前 i-2 个合法

           3.f[i-4]:最后一个为女生,那么前一个必为女生,i-2为女生,i-3为男生,前 i-4 个合法,这种前 i-2 个不合法的情况下加上最后两个女生就合法了。

代码:

#include<cstdio>#include<algorithm>using namespace std;typedef long long LL;const LL maxn1=1000;const LL maxn2=100;const LL len=1e8;LL f[maxn1+10][maxn2];void add(LL a[],LL b[]){  LL i,last=0;  a[0]=max(a[0],b[0]);  for(i=1;i<=a[0];i++)    {  a[i]+=b[i]+last;      last=a[i]/len,a[i]%=len;}  if(last)a[++a[0]]=last;}int main(){  LL n,i;  f[0][0]=1,f[0][1]=1;  f[1][0]=1,f[1][1]=1;  f[2][0]=1,f[2][1]=2;  f[3][0]=1,f[3][1]=4;  for(i=4;i<=maxn1;i++)    {      add(f[i],f[i-1]);      add(f[i],f[i-2]);      add(f[i],f[i-4]);}  while(scanf("%I64d",&n)!=EOF)    {      printf("%I64d",f[n][f[n][0]]);      for(i=f[n][0]-1;i>=1;i--)printf("%08I64d",f[n][i]);      printf("\n");}  return 0; }


0 0
原创粉丝点击