爬楼梯题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
用递归的思路来解的话,先找return点 f(0)=0; f(1)=1; f(2)=2; 然后找循环的点,可以可以画一下图 假设n为5的情况。 可以发现爬上第五个台阶的方法就等于第四阶加第三阶。 所以得出 f(n)=f(n-1)=f(n-2) 很像斐波那契数列。 然后用递归写出代码
#include<iostream>
#include<cstring>
using namespace std;
int f(int n)
{
if (n == 0 || n == 1 || n == 2)
{
return n;
}
else return f(n - 1) + f(n - 2);
}
int main() {
int n;
cin >> n;
cout << f(n);
}
这种暴力解法会出现大量重复计算,数据大的话效率会很低。 可以添加一个记录结果的数组,通过判断重复,进行优化
或者利用斐波那契数列的规律,直接把数据存入数组进行操作,这样写,计算的步骤就变成了查询,递归的逆向循环变成了正向计算。 这也就是动态规划的魅力。
动态规划代码
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n;
cin >> n;
int* a = new int[n+1];
for (int i = 0; i <= n; i++)
{
if (i == 0 || i == 1 || i== 2)
a[i] = i;
else a[i] = a[i - 1] + a[i - 2];
}
cout << a[n];
delete[]a;
}
|