解释这个动态编程攀爬n阶梯代码

时间:2013-03-30 17:33:11

标签: algorithm dynamic-programming

问题是

“你正在爬楼梯。每次你可以做一步或两步。楼梯有n步。你有多少不同的方式可以爬楼梯?”

以下是此问题的代码解决方案,但我无法理解它。任何人都可以解释我

int stairs(int n) {
  if (n == 0) return 0;
  int a = 1;
  int b = 1;
  for (int i = 1; i < n; i++) {
    int c = a;
    a = b;
    b += c;
  }
  return b;
 }

谢谢,

2 个答案:

答案 0 :(得分:11)

嗯,首先你需要了解递归公式,以及我们如何从中推导出迭代公式。

递归公式为:

f(n) = f(n-1) + f(n-2)
f(0) = f(1) = 1

f(n-1)为一步,f(n-2)为两步,总数是使用这些选项之一的方式数 - 因此总和)。

如果仔细观察 - 这也是一个众所周知的系列 - fibonacci numbers,解决方案只是计算每个数字,而不是一遍又一遍地重新计算递归,导致更多有效的解决方案。

答案 1 :(得分:0)

使用DP爬楼梯

class Solution {
   public:
     int climbStairs(int n) {
    int dp[n+1];

    if (n <= 1)
        return 1;

    if (n ==2)
        return 2;

    dp[0] = 1;
    dp[1] = 1;
    dp[2] = 2;

    for (int i = 3; i <=n; i++){
        dp[i] = dp[i-1]+dp[i-2];
    }

    return dp[n];
   }};