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;
	  }
}

 

 

 

posted @ 2013-03-25 21:09  supersnow0622  Views(194)  Comments(0)    收藏  举报