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
Sample Output
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
1 2 3
1
2
4
题意:给你n个人,只有男女之分,将他们排成一列,其中女孩不能单独排在一个;
该开始还以为是排列之类题型,但交了好几遍之后不对,然后百度才发现是递推加大数;
一个长度n的队列可以看成一个n - 1的队列再追加的1个小孩,这个小孩只可能是:
a.男孩,任何n - 1的合法队列追加1个男孩必然是合法的,情况数为f[n - 1];
b.女孩,在前n - 1的以女孩为末尾的队列后追加1位女孩也是合法的,我们可以转化为n - 2的队列中追加2位女孩;
得出 递推公式如下:
a.男孩,任何n - 1的合法队列追加1个男孩必然是合法的,情况数为f[n - 1];
b.女孩,在前n - 1的以女孩为末尾的队列后追加1位女孩也是合法的,我们可以转化为n - 2的队列中追加2位女孩;
一种情况是在n - 2的合法队列中追加2位女孩,情况数为f[n - 2];
但我们注意到本题的难点,可能前n - 2位以女孩为末尾的不合法队列(即单纯以1位女孩结尾),也可以追加2位女孩成为合法队列,而这种n - 2不合法队列必然是由n - 4合法队列+1男孩+1女孩的结构,即情况数为f[n - 4]。
若感觉本题较难,可先查看文章:[ACM_HDU_2045]LELE的RPG难题,思路与本题类似,但较为简单。
#include <iostream>
#include <cstdio>
#include <cstring>
#include<iostream>
#include <string>
#include<set>
#include <algorithm>
using namespace std;
int a[1001][500];
int main()
{
memset(a,0,sizeof(a));a[0][0]=1;a[0][1]=1;
a[1][0]=1,a[1][1]=1;a[2][0]=1,a[2][1]=2;a[3][0]=1,a[3][1]=4;
for(int i=4;i<1001;i++){
int j=1,x=0;
while(j<=a[i-1][0]||j<=a[i-2][0]||j<=a[i-4][0]){
a[i][j]=a[i-1][j]+a[i-2][j]+a[i-4][j]+x;
x=a[i][j]/10;a[i][j]%=10;j++;
}
a[i][j]=x;
if(a[i][j]==0)j--;
a[i][0]=j;
}
int n;
while(cin>>n){
for(int i=a[n][0];i>0;i--)cout<<a[n][i];
cout<<endl;
}
return 0;
}
得出 递推公式如下:
- f[n] = f[n - 1] + f[n - 2] + f[n - 4]