【动态规划1】

力扣509.斐波那契数

链接: link

思路

这是一道经典的动态规划DP题,做动态有5步:
1.确定dp[i]含义,表示第i个数的斐波那契数值是dp[i]
2.dp数组初始化
3.确定递推公式
4.确定遍历顺序,从递推公式可以知道dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
5.举例推导,草稿完成

class Solution {
    public int fib(int n) {
        if (n <= 1) {
            return n;
        }
        int[] dp = new int[n+1]; // 1.确定dp数组,以及下标含义
        dp[0] = 0;
        dp[1] = 1;// 2.dp数组的初始化
        // 4.确定遍历顺序,从3可以知道遍历顺序一定是从前往后的
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2]; // 3.确定递推公式
        }
        // 5.举例推导(草稿完成)
        return dp[n];
    }
}

70.爬楼梯
链接link

class Solution {
    public int climbStairs(int n) {
        if (n <= 1) {
            return 1;
        }
        int[] dp = new int[n + 1];// 确定dp数组,下标i表示到第i层有dp[i]种方法
        dp[0] = 1;
        dp[1] = 1;// dp数组初始化
        // 遍历顺序
        for (int i = 2; i <= n; i++) {
            // 确定递推公式
            // dp[i-1] 表示上i-1层有dp[i-1]种方法,那么再跳一步就到dp[i]了
            // dp[i-2] 表示上i-2层有dp[i-2]中方法,那么再跳两步就到dp[i]了
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

746.使用最小花费爬楼梯
链接: link

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int len = cost.length;
        int[] dp = new int[len + 1];//1.到达第i台阶所花费的最少体力为dp[i]
        dp[0] = 0;
        dp[1] = 0;//2.初始化
        //4.确定遍历顺序
        for(int i = 2;i<=len;i++){
            //3.确定递推公式
            //可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]
            //dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]
            //dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]
            dp[i] = Math.min(dp[i-1] + cost[i-1] , dp[i-2] + cost[i-2]);
        }
        return dp[len];
    }
}

你可能感兴趣的:(动态规划,算法)