zoukankan      html  css  js  c++  java
  • 房屋染色 II

    房屋染色 II

    题目:
    这里有n个房子在一列直线上,现在我们需要给房屋染色,共有k种颜色。每个房屋染不同的颜色费用也不同,你希望每两个相邻的房屋颜色不同,但是这样可能会使得成本上升。因此你决定可以有一个长度不超过t的区间,这之间的房屋可以染成同一种颜色。

    费用通过一个nxk 的矩阵给出,比如cost[0][0]表示房屋0染颜色0的费用,cost[1][2]表示房屋1染颜色2的费用。

    样例
    样例1

    输入:
    costs = [[14,2,11],[11,14,5],[14,3,10]]
    输出: 10
    说明:
    三个屋子分别使用第1,2,1种颜色,总花费是10。
    样例2

    输入:
    costs = [[5]]
    输出: 5
    说明:
    只有一种颜色,一个房子,花费为5

    解题思路:和房屋染色类似,只是从3种颜色变成了k种颜色,因为每一次都要遍历k种颜色寻找最小花费,所以做了优化先将最小值和次小值找到然后再进行dp数组的计算

    public class Solution {
        /**
         * @param costs: n x k cost matrix
         * @return: an integer, the minimum cost to paint all houses
         */
        public int minCostII(int[][] costs) {
            int n = costs.length;
            if(n == 0)
                return 0;
            int k = costs[0].length;
            if(k == 0)
                return 0;
            
            //数组定义:dp[i][j] 表示的是 0 -> i - 1号房刷j种颜色的最小花费
            int dp[][] = new int[n + 1][k];
            int ans = Integer.MAX_VALUE;
            
            /**
            状态方程 dp[i][j] = min(dp[i - 1][0..k-1]) + cost[i - 1][j]
            **/
            
            for(int i = 1; i <= n; i++) {
                int firMin = Integer.MAX_VALUE, secMin = Integer.MAX_VALUE;
                int firIdx = 0, secIdx = 0;
                
                //寻找最小值和次小值以及他们的下标
                for(int j = 0; j < k; j++) {
                    if(dp[i - 1][j] < firMin) {
                        secMin = firMin;
                        secIdx = firIdx;
                        firMin = dp[i - 1][j];
                        firIdx = j;
                    } else if(dp[i - 1][j] < secMin) {
                        secMin = dp[i - 1][j];
                        secIdx = j;
                    }
                }
                
                for(int j = 0; j < k; j++) {
                	//因为相邻房屋不能涂相同颜色,所以当j等于最小值下标时要选择次小值
                    if(j != firIdx) {
                        dp[i][j] = firMin + costs[i - 1][j];
                    } else {
                        dp[i][j] = secMin + costs[i - 1][j];
                    }
                }
            }
            
            for(int i = 0; i < k; i++) {
                ans = Math.min(ans, dp[costs.length][i]);
            }
            
            return ans;
        }
    }
    
  • 相关阅读:
    Docker
    Oracle-----RAC重启步骤 RAC管理(crs_stat、crsctl、srvctl)
    kubernetes 设备插件
    golang signal.Notify 信号,如何优雅的退出
    golang 通过fsnotify监控文件
    Golang中基础的命令行模块urfave/cli的用法说明
    fatal: unable to access 'xxx': Encountered end of file
    client-go 和 golang 源码中的技巧
    Golang之wait.Until 简单测试用例
    go viper 库
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/13999522.html
Copyright © 2011-2022 走看看