随想录训练营Day37 | DP - - 509. 斐波那契数, 70. 爬楼梯,746. 使用最小花费爬楼梯

66 阅读1分钟

随想录训练营Day37 | DP - - 509. 斐波那契数, 70. 爬楼梯,746. 使用最小花费爬楼梯

标签: LeetCode闯关记


509. 斐波那契数

class Solution {
    public int fib(int n) {
        if(n < 2){
            return n;
        }
        int a = 0; int b = 1;//初始化
        int c = 0;
        for (int i = 2; i <= n; i++) {//dp数组含义
            c = a + b;//递归公式 //遍历顺序 从前向后
            a = b;
            b = c;
        }
        return c;
    }
}

70. 爬楼梯

summary:cf 509. 斐波那契数,进阶处在于需要自己推导递推公式

class Solution {
    public int climbStairs(int n) {
        if(n <= 2){
            return n;
        }
        int[] stairs = new int[n + 1];//dp数组表示爬到第n阶楼梯有stairs[n]种方法
        stairs[1] = 1;//初始化  思考 stairs[0]有没有含义
        stairs[2] = 2;
        for (int i = 3; i <= n; i++) {
            stairs[i] = stairs[i-1] + stairs[i-2];//递推公式
        }
        return stairs[n];
    }
}

746. 使用最小花费爬楼梯

key: 明确题意,递推公式提取抓题一旦你支付此费用,即可选择向上爬一个或者两个台阶,由此可知,到达第i个位置需要花费的体力与前两个台阶有关。

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int len =cost.length;
        int[] dp = new  int[len + 1];//dp数组的含义: 到达第i个位置需要花费dp[i]
        dp[0] = 0;//初始化
        dp[1] = 0;//初始化
        for (int i = 2; i <= len; i++) {
            dp[i] = Math.min(dp[i-1] + cost[i-1],dp[i-2] + cost[i-2] );//递推公式
        }
        return dp[len];
    }
}