当前位置: 代码迷 >> 综合 >> HDOJ-1297 Children’s Queue(递推,大数相加)
  详细解决方案

HDOJ-1297 Children’s Queue(递推,大数相加)

热度:77   发布时间:2023-12-09 20:51:04.0

题目: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++)    //模拟对应位置相加