栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode——剑指 Offer II 091. 粉刷房子

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode——剑指 Offer II 091. 粉刷房子

通过万岁!!!

  • 题目:一共n个房子,然后让你给房子粉刷颜色,要求相邻的房子的颜色不能一样。并且每个房子的每种颜色都有不同的价格。一共有三种颜色。
  • 思路:这个题可以看到,是动态规划的问题。虽然动态规划的题目相对麻烦一点,但是已经做了好多个了,基本也熟悉了。首先是如何判断是动态规划问题,就是我们从1到n,我们可以在任何位置停止,都是一个子问题。这时候基本可以往动态规划上考虑了。然后就是动态规划的公式,我们在第i个房子的时候,假设弄成颜色1,则需要将前面房子(i-1)的颜色2或者3时成本的最小值,加上当前房子颜色1的成本。然后再考虑当前房子(第i个)弄成颜色2和颜色3的时候。然后最后返回第n个房子三种颜色的对应的成本的最小值。
    • dp数组:i表示第几个房子,j表示第几种颜色,其存储的值表示,这时候的成本。
    • 初始化:第一个房子每种颜色的成本即可。
    • 最后输出:dp数组第n行,三种颜色的花费的最小值。
    • 递推公式:第一种颜色:dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i][0],然后还有两种颜色,也是类似。
  • 技巧:动态规划。

java代码

class Solution {
    public int minCost(int[][] costs) {
        int n = costs.length;
        int[][] dp = new int[n][3];
        dp[0][0] = costs[0][0];
        dp[0][1] = costs[0][1];
        dp[0][2] = costs[0][2];
        for (int i = 1; i < n; i++) {
            // 选择红色
            dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + costs[i][0];
            // 选择蓝色
            dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + costs[i][1];
            // 选择绿色
            dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + costs[i][2];
        }
        int ans = Math.min(dp[n - 1][0], dp[n - 1][1]);
        ans = Math.min(ans, dp[n - 1][2]);
        return ans;
    }
}
  • 总结:题目还可以,公式也比较简单,还是得做的多了,才能分析的更加透彻。这里也相当于再次总结了动态规划的解题步骤,也就是四要素(数组含义、初始化、输出、递推公式)。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992107.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号