问题描述
一个顽猴在一座有30级台阶的小山上爬山跳跃,猴子上山一步可跳1级,或跳3级,试求上山的30级台阶有多少种不同的爬法。算法分析
这一问题实际上是一个整数有序可重复拆分问题,试应用数组递推求解。
设爬k级台阶的不同爬法为f(k)种,首先探求f(k)的递推关系。
上山最后一步到达第30级台阶,完成上山,共有f(30)种不同的爬法;
要爬30级,那么第一次可以爬几级呢?要么第一次爬了1级,还有f(29)种,要么爬了3级,还有f(27)种于是
f(30)=f(29)+f(27)
依此类推,一般地有递推关系:
f(k)=f(k−1)+f(k−3) (k>3)
初始条件:
f(1)=1;即1=1
f(2)=1;即2=1+1
f(3)=2;即3=1+1+1;3=3
根据以上递推关系与初始条件,设置一重循环应用递推模式(1)即可求出f(n)。- 程序代码
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int* arr =