题目描述:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法
先来分析下这个问题:
当N=1时,这个很好理解,只能跨1步这一种了
当N=2时,因为你每次可以跨1步或2步,那就是走2步或走两个1步
当N=3时,因为你可以跨1步或2步,那你在台阶1或台阶2都能行,那后面就要计算到台阶1有多少种走法,到台阶2有多少种走法,然后2着相加,依次逆推
当N=4时,那你在台阶4或台阶3都能行,那后面就要计算到台阶3有多少种走法,到台阶4有多少种走法,然后2着相加,依次逆推
总结如下,你会发现这是斐波拉切数列,但是使用递归出出现重复计算问题,所以选择动态规划算法。
第一层:1种,记为f(1)=1(边界)
第二层:2种(走2步或走两个1步),记为f(2)=2
第三层:3种(在第一层走2步或在第二层走1步),记为f(3)=f(1)+f(2)
第四层:5种(在第二层走2步或在第三层走1步),记为f(4)=f(2)+f(3)
class Solution {
public:
int dynamic(int n) {
if(n < 3)
return n;
else{
int i = 1;
int j = 2;
int res = 0;
for(int k = 0; k < n - 2; k++){从第三层开始计算
res = i + j;
i = j;
j = res;
}
return res;
}
}
};
int main(){
Solution s;
int n = s.dynamic(4);
std::cout<< "n=" << n << std::endl;
}
运行打印:n=5
i,j首先赋边界值,res保存i+j的值,每次前进,i,j,res的值都会被赋到前面结果的值。上面的算法是底向上,递归相当于自顶向下,避免了重复计算