Children’s Queue(HDOJ1297)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1297
解题分析:
按照最后一个人的性别分析,他要么是男,要么是女,所以可以分两大类讨论:
1、如果n个人的合法队列的最后一个人是男,则对前面n-1个人的队列没有任何限制,他只要站在最后即可,所以,这种情况一共有F(n-1);
2、如果n个人的合法队列的最后一个人是女,则要求队列的第n-1个人务必也是女生,这就是说,限定了最后两个人必须都是女生,这又可以分两种情况:
2.1、如果队列的前n-2个人是合法的队列,则显然后面再加两个女生,也一定是合法的,这种情况有F(n-2);
2.2、但是,难点在于,即使前面n-2个人不是合法的队列,加上两个女生也有可能是合法的,当然,这种长度为n-2的不合法队列,不合法的地方必须是尾巴,就是说,
这里说的长度是n-2的不合法串的形式必须是“F(n-4)+男+女”,这种情况一共有F(n-4).
注意:这里的数字很大,存储需使用数组
代码如下:
#include<iostream>
using namespace std;
int main()
{
int arr[1001][101]={0};
arr[0][1]=1;
arr[1][1]=1;
arr[2][1]=2;
arr[3][1]=4;
for(int i=4;i<1001;i++)
{
for(int j=1;j<101;j++)
{
arr[i][j]+=arr[i-1][j]+arr[i-2][j]+arr[i-4][j];//
arr[i][j+1]+=arr[i][j]/10000;//
arr[i][j]=arr[i][j]%10000;//
}
}
int num;
while(cin>>num)
{
int k=100;
for(;arr[num][k]==0;k--);
cout<<arr[num][k];
for(;k>1;)
{
k--;
cout.width(4);
cout.fill('0');
cout<<arr[num][k];
}
cout<<endl;
}
}

浙公网安备 33010602011771号