Java 动态规划“爬楼梯”,不懂逻辑
Java dynamic programming “Climbing Stairs”, do not understand the logic
问题是:你正在爬楼梯。到达顶部需要 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;
}
递推公式为
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
,下面为 n >= 2
计算了 f(n) = f(n-1) + f(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
}
代码本身基本上是一个斐波那契数生成器。
int a = 1;
int b = 1;
int c = 1;
for (int i=2; i<=n; i++){
c = b;
b = a + b;
a = c;
}
创建第 n
个斐波那契数,从 1 开始代表 n = 0
。
所以更重要的问题是:
可能的方式数如何对应斐波那契数列?
对于 n = 0
和 n = 1
,答案很简单:只有一种方法:不要移动 (0),迈出一步 (1)。对于任何其他 n
,我们可以使用递归方法:有两种方法可以到达步骤 n
:从 n - 1
走一小步或从 n - 2
走一大步。这与斐波那契数列相同:fib(n + 2) = fib(n + 1) + fib(n)
.
问题是:你正在爬楼梯。到达顶部需要 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;
}
递推公式为
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
,下面为 n >= 2
f(n) = f(n-1) + f(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
}
代码本身基本上是一个斐波那契数生成器。
int a = 1;
int b = 1;
int c = 1;
for (int i=2; i<=n; i++){
c = b;
b = a + b;
a = c;
}
创建第 n
个斐波那契数,从 1 开始代表 n = 0
。
所以更重要的问题是:
可能的方式数如何对应斐波那契数列?
对于 n = 0
和 n = 1
,答案很简单:只有一种方法:不要移动 (0),迈出一步 (1)。对于任何其他 n
,我们可以使用递归方法:有两种方法可以到达步骤 n
:从 n - 1
走一小步或从 n - 2
走一大步。这与斐波那契数列相同:fib(n + 2) = fib(n + 1) + fib(n)
.