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;
    }
}
  • 总结:题目还可以,公式也比较简单,还是得做的多了,才能分析的更加透彻。这里也相当于再次总结了动态规划的解题步骤,也就是四要素(数组含义、初始化、输出、递推公式)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值