动态规划入门:爬楼梯问题的多语言解法
题目简介
- 爬楼梯是一个经典的动态规划问题,非常适合初学者入门。问题描述如下:假设你正在爬楼梯,需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。问你有多少种不同的方法可以爬到楼顶。
例如:
- 输入:n = 2
- 输出:2
- 解释:有两种方法可以爬到楼顶。(1 阶 + 1 阶)和(2 阶)
解题思路
这个问题的关键是理解“动态规划”(Dynamic Programming,DP)的概念。我们可以将大问题分解为较小的子问题,然后组合子问题的解以得到原问题的解。对于爬楼梯问题,我们可以这样思考:
- 当我们在第 n 阶台阶时,我们是从第 n-1 阶或第 n-2 阶上来的。
- 因此,到达第 n 阶的方法数等于到达第 n-1 阶和第 n-2 阶方法数之和。
这就形成了一个斐波那契数列。
代码实现
以下是使用不同编程语言的实现,核心逻辑是一致的:
Python 实现
class Solution:
def climbStairs(self, n: int) -> int:
n_1, n_2 = 2, 1
if n == 1:
return n_2
elif n == 2:
return n_1
for _ in range(2, n):
n_1, n_2 = n_1 + n_2, n_1
return n_1
Go 实现
func climbStairs(n int) int {
n_1 := 2
n_2 := 1
if n == 1 {
return n_2
} else if n == 2 {
return n_1
}
for i := 2; i < n; i++ {
temp := n_1
n_1 = n_1 + n_2
n_2 = temp
}
return n_1
}
C++ 实现
typedef long long ll;
class Solution {
public:
int climbStairs(int n) {
ll a = 1, b = 2;
if (n == 1) return 1;
if (n == 2) return 2;
for (int i = 2; i < n; i++) {
ll t = b;
b += a;
a = t;
}
return b;
}
};
Java 实现
class Solution {
public int climbStairs(int n) {
int n_1 = 2, n_2 = 1;
if (n == 1) return n_2;
for (int i = 2; i < n; i++) {
int temp = n_1;
n_1 += n_2;
n_2 = temp;
}
return n_1;
}
}
JavaScript 实现
var climbStairs = function(n) {
let n_1 = 2, n_2 = 1;
if (n == 1) return n_2;
for (let i = 2; i < n; i++) {
let temp = n_1;
n_1 += n_2;
n_2 = temp;
}
return n_1;
};
总结
爬楼梯问题是动态规划的经典案例,适合初学者理解和掌握动态规划的基本概念。通过多种编程语言的实现,我们可以看到不同语言如何应用相同的逻辑来解决问题。这种跨语言的思维方式对于编程能力
的提升是非常有益的。