题意:爬台阶问题。每次能爬一个或两个台阶,问一个有n个台阶的话,一共有几种方法爬到顶端。
思路:
n<=1,此时只有一种。
n>1时,对于每一个台阶i,要到达台阶,最后一步都有两种方法,从i-1迈一步,或从i-2迈两步。
dp(0) = 1
dp(1) = 1
dp(2) = dp(2-1) + dp(2-2)
dp(3) = dp(3-1) + dp(3-2)
……
状态转移方程其实就是Fibonacci数列。
方法一:动态规划
public int climbStairs(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
方法二:递推公式
public int climbStairs(int n) {
double d = Math.sqrt(5);//根号5
n = n + 1;
return (int) ((Math.pow((1 + d) / 2, n) - Math.pow((1 - d) / 2, n)) / d + 0.5);
}