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

题目: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...
摘要由CSDN通过智能技术生成

题目: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++)    //模拟对应位置相加
	
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值