原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1297
分析:
从最后一个分析。
1.最后一个n是男的,前面只要符合要求便可。所以是F(n-1)
2.最后一个n是女的,则倒数第二个(n-1)必定为女的。这又可分为两种情况:
①前面n-2个只要符合要求就行,所以有F(n-2)
②前面n-2个不符合要求,但加上n-1,n两个女的之后,便符合要求了,即 F(n-4)+男(n-3)+女(n-2)+女(n-1)+女(n)
所以可得出递推公式:
F(n)=F(n-1)+F(n-2)+F(n-4)
还要注意本题数据过大,需要高精度。
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
const int BASE = 100000000;
int main()
{
int F[1000 + 2][100+2];
memset(F, 0, sizeof(F));
F[0][0] = 1;
F[1][0] = 1;
F[2][0] = 2;
F[3][0] = 4;
for (int i = 4; i <= 1000; i++)
{
for (int j = 0; j <= 100; j++)
{
F[i][j] += F[i - 1][j] + F[i - 2][j] + F[i - 4][j];
F[i][j + 1] = F[i][j]/ BASE;
F[i][j] %= BASE;
}
}
int n;
while (cin >> n)
{
int k = 100;
while (F[n][k] == 0)
k--;
cout << F[n][k--]; //最高位不能补0
while (k >= 0)
printf("%08d", F[n][k--]); //补满8位
cout << endl;
}
return 0;
}