【问题标题】:Java dynamic programming “Climbing Stairs”, do not understand the logic [duplicate]Java动态编程“爬楼梯”,不懂逻辑[重复]
【发布时间】:2016-04-06 19:09:08
【问题描述】:

问题是:您正在爬楼梯。到达顶部需要 n 步。 每次您可以爬 1 或 2 级台阶。您可以通过多少种不同的方式登顶?

我看到了一个正确的 java 代码,但我不明白其中的逻辑。谁能给我解释一下? a,b,c 代表什么?

public int climbStairs(int n) {

    if (n<2) return 1;

    int a = 1;
    int b = 1;
    int c = 1;

    for (int i=2; i<=n; i++){
        c = b;
        b = a + b;
        a = c;
    }
    return b;
}

【问题讨论】:

    标签: java algorithm dynamic-programming fibonacci


    【解决方案1】:

    代码本身基本上是一个斐波那契数生成器。

    int a = 1;
    int b = 1;
    int c = 1;
    
    for (int i=2; i<=n; i++){
        c = b;
        b = a + b;
        a = c;
    }
    

    创建nth 斐波那契数,从n = 0 的1 开始。

    所以更重要的问题是:
    可能方式的数量如何对应斐波那契行?

    对于n = 0n = 1,答案很简单:只有一种方法:不动 (0),迈出一步 (1)。对于任何其他n,我们可以使用递归方法:有两种方法可以到达步骤n:从n - 1 迈出一小步,或者从n - 2 迈出一大步。与斐波那契序列相同:fib(n + 2) = fib(n + 1) + fib(n)

    【讨论】:

      【解决方案2】:

      递归公式是

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

      在代码中翻译成a, b, c

      if (n<2) return 1;
      
      int a = 1;
      int b = 1;
      int c = 1;
      

      上面定义f(0) = f(1) = 1,下面定义f(n) = f(n-1) + f(n-2)n &gt;= 2

      for (int i=2; i<=n; i++){
          c = b;     // f(i-1) is temporary saved in c
          b = a + b; // f(i-2) + f(i-1) is saved in b
          a = c;     // f(i-1) is saved in a for the next iteration
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-20
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-11
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        相关资源
        最近更新 更多