有一楼梯共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]);
}
}