动态规划解爬楼梯问题
问题描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
解题思路
这个问题跟取石子是相同的,很自然想到动态规划。
设,爬到楼顶共有f(n)种方法,共有n阶台阶(n阶台阶,f(n)种方法),想要爬完最后一阶楼梯前,可以是剩下最后一阶台阶,或者是剩下最后两阶。如果是剩下一阶,则应该有f(n-1)种方法(保持映射关系,n-1阶台阶,f(n-1)种方法);如果剩下最后两阶,则应该有f(n-2)种方法。因为爬完n-1和爬完n-2是两种不同方式,为了爬完n阶楼梯,这是可以叠加的,即 f(n) = f(n-1) + f(n-2);这便是状态转移公式,公式的出口应该是 f(0) = 1 和 f(1) = 1;由此可以创建一个数组用于存放每个f(n)的值,即n阶楼梯对应的方法总数。
代码:
public class ClimbingStairs {
public static void main(String[] args) {
System.out.println(climbStairs(5));
}
public static int climbStairs(int n) {//方法参数n为楼梯数
int[] ans = new int[n+1];//用于存放方法数,f(n)即最后爬完n阶楼梯的方法总数
ans[0] = 1;
ans[1] = 1;
for (int i = 2; i < n + 1; i++) {
ans[i] = ans[i-1] + ans[i-2];
}
return ans[n];//返回方法总数
}
}
因为只有一个for循环,所以时间复杂度为O(n)。