超级楼梯

有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
思路:
对于M级楼梯,我现在站在第一级楼梯上,还剩M-1级楼梯要等着我去爬完,让step=M-1表示要爬的级数,我的腿很短,每次要么爬一级,要么爬两级
考虑两种极端情况
一种是一级一级向上蹦的情况
一种是两级两级向上跨的情况
两级两级向上跨的那种情况还要考虑最后有没有留出1个单独台阶
所以step要分奇数偶数来讨论
用组合数公式发现(以出现几个2来组合)
出现0个2,1个2,2个2…等等…等等
不管是奇数还是偶数,通过规律发现其公式是一样的,所以可以把两部合为一部来写
对于单独组合数公式,我们要先化简,优点不仅减少时间空间复杂度,而且可以防止过程中值溢出
这是我简单化简后的组合数公式代码
最后下面是我的cpp代码

#include <iostream>
typedef long long ll;
ll C(int n, int m)
{
	if (m < n - m)m = n - m;
	ll ans = 1;
	for (int i = m + 1; i <= n; i++)
		ans *= i;
	for (int i = 1; i <= n - m; i++)
		ans /= i;
	return ans;
}
using namespace std;
int main()
{
	int n;
	cin >> n;
	while(n--) {
		int sum = 0;
		int m;
		cin >> m;
		const int step = m - 1;
		int mi = step/ 2;
		int mx = step;
		for (int i = 0; i <= mi; i++) {
			sum += C(step - i, i);
		}
		cout << sum << endl;
		
	}
	return 0;
}

这题也可以一个一个列找一下规律
发现是一个斐波那契数列的题型
F[N]=F[N-1]+F[N-2]
理论:考虑最后一步,要么是蹦一级要么是跨两级
要到n级
蹦一级是到n-1级的一种情况
跨两级是到n-2级的一种情况
两种情况相加就是到n级的一种情况
C语言代码如下

#include<stdio.h>
int arr[42];
 
int main()
{
    int N,n;
    scanf("%d",&N);
    arr[0]=0;
    arr[1]=0;
    arr[2]=1;
    arr[3]=2;
    while(N--) {
        scanf("%d",&n);
    for(int i=4;i<=n;i++)
    {
        arr[i]=arr[i-1]+arr[i-2];
    }
    printf("%d\n",arr[n]);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

veit sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值