【问题标题】: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 = 0 和n = 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 >= 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
}