题目的意思很明确,不能单独有一个女生站一起。
假设有N个人。
1.最后一个人是男生,则有F(N - 1)。
2.最后一个人是女生,则第N - 1也是女生,则有F(N - 1)。
但还有一种就是,第N - 2个是女生,(是男生的话,包含在F(N - 1)中),但是第N - 3 个是男生,则不包含在上面的情况中,但是也是符合的。也就是最后三个是女生,倒数第四个是男生。也就是还有F(N - 4)种。
所以有递推公式:F(N) = F(N - 1) + F(N - 2) + F(N - 4)。
下面的是AC的代码:
#include <iostream>
#include <cstring>
using namespace std;
char num[1001][300];
void add(int x, int y) //大数相加函数
{
int temp[300];
int len1 = strlen(num[x]);
int len2 = strlen(num[y]);
int i, j, k = 0;
for(i = len1 - 1, j = len2 - 1; i >= 0 && j >= 0; i--, j--)
{
temp[k++] = num[x][i] - '0' + num[y][j] - '0';
}
while(i >= 0)
{
temp[k++] = num[x][i--] - '0';
}
while(j >= 0)
{
temp[k++] = num[y][j--] - '0';
}
for(i = 0; i < k - 1; i++)
{
if(temp[i] >= 10)
{
temp[i + 1] += temp[i] / 10;
temp[i] %= 10;
}
}
if(temp[k - 1] >= 10)
{
temp[k] = temp[k - 1] / 10;
temp[k - 1] %= 10;
k++;
}
i = k - 1;
j = 0;
while(i >= 0)
{
num[x][j++] = temp[i--] + '0';
}
num[x][k] = '\0';
}
int main()
{
int i;
num[0][0] = '1'; num[0][1] = '\0';
num[1][0] = '1'; num[1][1] = '\0';
num[2][0] = '2'; num[2][1] = '\0';
num[3][0] = '4'; num[3][1] = '\0';
num[4][0] = '7'; num[4][1] = '\0';
for(i = 5; i <= 1000; i++)
{
strcpy(num[i], num[i - 1]);
add(i, i - 2);
add(i, i - 4);
}
while(cin >> i)
{
cout << num[i] << endl;
}
return 0;
}