zoukankan      html  css  js  c++  java
  • 265. Paint House II

    问题描述:

    There are a row of n houses, each house can be painted with one of the k colors. The cost of painting each house with a certain color is different. You have to paint all the houses such that no two adjacent houses have the same color.

    The cost of painting each house with a certain color is represented by a n x k cost matrix. For example, costs[0][0] is the cost of painting house 0 with color 0; costs[1][2] is the cost of painting house 1 with color 2, and so on... Find the minimum cost to paint all houses.

    Note:
    All costs are positive integers.

    Example:

    Input: [[1,5,3],[2,9,4]]
    Output: 5
    Explanation: Paint house 0 into color 0, paint house 1 into color 2. Minimum cost: 1 + 4 = 5; 
                 Or paint house 0 into color 2, paint house 1 into color 0. Minimum cost: 3 + 2 = 5. 
    

    Follow up:
    Could you solve it in O(nk) runtime?

    解题思路:

    题目要求求最小的花费,我们会首先想到动态规划。

    题目中要求的是相邻的两个房子的颜色不能相等, 若我们给当前第i个房子涂上颜色j, 则代表第i-1个房子不能涂颜色j

    我们可以用数组lowest[j]表示涂到当前房屋除了涂j个颜色在其他选择中最小的花费。

    则我们在计算下一个房子涂颜色j时的总花费为:lowest[j] + costs[i][j]

    所以我们在每一次计算完这个房子所有可能的耗费后,要更新lowest为当前房子的情况。

    需要注意的是,这样比较不能涵盖只有一个房子和一个颜色的情况,所以需要单独列出来。

    代码:

    class Solution {
    public:
        int minCostII(vector<vector<int>>& costs) {
            int n = costs.size();
            if(n == 0) return 0;
            int m = costs[0].size();
            if(m == 0) return 0;
            
            if(m == 1 && n == 1) return costs[0][0];
            
            vector<int> lowest(m, 0);
            for(int i = 0; i < n; i++){
                vector<int> temp(m, INT_MAX);
                for(int j = 0; j < m; j++){
                    lowest[j] += costs[i][j];
                    if(j > 0){
                        temp[j] = min(temp[j-1], lowest[j-1]);
                    }
                }
                int low = lowest[m-1];
                for(int j = m-2; j > -1; j--){
                    temp[j] = min(temp[j], low);
                    low = min(low, lowest[j]);
                }
                lowest = temp;
            }
            int ret = lowest[0];
            for(int i = 0; i < m; i++){
                ret = min(ret, lowest[i]);
            }
            return ret;
        }
    };
  • 相关阅读:
    【STM32F429】第4章 RTX5操作系统移植(MDK AC5)
    【STM32F407】第4章 RTX5操作系统移植(MDK AC5)
    【STM32H7】第3章 RTX5操作系统介绍
    【STM32F429】第3章 RTX5操作系统介绍
    【STM32F407】第3章 RTX5操作系统介绍
    【STM32H7】第2章 初学RTX5准备工作
    【STM32F429】第2章 初学RTX5准备工作
    Hystrix解析(一)
    Eureka源码解析(五)
    Eureka源码分析(四)
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9315835.html
Copyright © 2011-2022 走看看