// 2 2
// 3 3
// 45 1836311903 额外加的 纯递归超时了
// 递归加记忆化
pub fn climb_stairs(n: i32) -> i32 {
fn climb(n: i32, memo: &mut Vec<i32>) -> i32 {
if n <= 2 {
return n;
}
if memo[n as usize] == 0 {
memo[n as usize] = climb(n - 1, memo) + climb(n - 2, memo);
}
memo[n as usize]
}
let mut memo = vec![0; (n + 1) as usize];
climb(n, &mut memo)
}
// 动态规划
pub fn climb_stairs2(n: i32) -> i32 {
if n <= 2 {
return n;
}
let mut dp = vec![0; (n + 1) as usize];
dp[1] = 1;
dp[2] = 2;
for i in 3..=n {
dp[i as usize] = dp[(i - 1) as usize] + dp[(i - 2) as usize];
}
dp[n as usize]
}
// 滚动数组
pub fn climb_stairs3(n: i32) -> i32 {
if n <= 2 {
return n;
}
let (mut a, mut b) = (1, 2);
for _ in 3..=n {
let temp = a + b;
a = b;
b = temp;
}
b
}
fn main() {
assert_eq!(climb_stairs(2), 2);
assert_eq!(climb_stairs(3), 3);
assert_eq!(climb_stairs(45), 1836311903);
assert_eq!(climb_stairs2(2), 2);
assert_eq!(climb_stairs2(3), 3);
assert_eq!(climb_stairs2(45), 1836311903);
assert_eq!(climb_stairs3(2), 2);
assert_eq!(climb_stairs3(3), 3);
assert_eq!(climb_stairs3(45), 1836311903);
}