题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1297
题解:
D[n]表示有n个人时,满足排队要求的个数。
分类讨论:
1.第n个人为男生时,满足排队要求的个数等于D[n-1].
2.第n个人为女生时,第n-1个必为女生,才满足要求。
此处还要进行一次分类:
a.前n-2个满足排队要求时,个数为D[n-2].
b.前n-2个不满足排队要求时,第n-2个只能是女生,第n-3个只能是男生,则个数为D[n-4]。
得到递推式:D[n]=D[n-1]+D[n-2]+D[n-4]
此题数据较大,当n=1000时,据说有2百多位(度娘说的),我测了下有245位。
可以开个二维数组a[1001][251].
代码:
#include<stdio.h>
int a[1001][251]={0};
int main()
{
int n;
a[1][250]=1,a[2][250]=2,a[3][250]=4,a[4][250]=7;
while(scanf("%d",&n)!=EOF)
{
int i,j;
for(i=5;i<=n;i++)
{
int temp=0;
for(j=250;j>=0;j--)
{
temp=temp+a[i-1][j]+a[i-2][j]+a[i-4][j];
a[i][j]=temp%10;
temp=temp/10;
}
}
for(j=0;j<=250;j++)
{
if(a[n][j]!=0)
break;
}
for(i=j;i<=250;i++)
{
printf("%d",a[n][i]);
}
printf("\n");
}
return 0;
}