题目:HDOJ-1297
题目描述:n个人排队,女生必须和女生相邻(可以2个以上,也可以1个都没有),问有多少中排队方法。(1<=n<=1000)
例如当n=4,有7种情况,分别为 :(F为女生,M为男生)
FFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMM
思路:(逆推思路)
对n位置情况进行讨论:
1.当n位置为M,对前n-1无影响,所以直接就等于 f(n-1)
2.当n位置为F,则n-1一定得是F,接下来对n-2位置的情况进行讨论:
a.当n-2位置为M,对前n-2无影响,所以该情况等于 f(n-2)
b.当n-2位置为F,n-3位置为M,对前n-4无影响,该情况等于 f(n-4)
这里为什么不对n-3位置为F进行讨论呢,因为当n-2,n-3位置均为F时,前n-2已经属于合法队列,该情况已经被包含在2-a中。
这里讨论n-2位置为F,n-3位置为M,是为了补充本身不合法,但是跟上n-1位置的F以后就合法的情况
综上所述 :f(n) = f(n-1) + f(n-2) + f(n-4)
此外,就是当n大了以后,答案是64位都存不下的,所以这题还要模拟大数相加。
我用了string来从个位开始存储大数,最后倒着输出。
以下AC代码:
#include<cstdio>
#include<string>
using namespace std;
string add(string s1, string s2)
{
int L1 = s1.length();int L2 = s2.length();int i;string outcome;bool flag = false; //标记是否要进位for (i = 0; i < L1 && i < L2;i++) //模拟对应位置相加