[Leetcode 265]Paint House II

32 篇文章 0 订阅

题目链接: http://www.lintcode.com/en/problem/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 0costs[1][2] is the cost of painting house 1 with color 2, and so on... Find the minimum cost to paint all houses.

Example:

Given n = 3, k = 3, costs = [[14,2,11],[11,14,5],[14,3,10]] return10

house 0 is color 2, house 1 is color 3, house 2 is color 2,2 + 5 + 3 = 10

Time Complexity is O(nk)

class Solution {
public:
    /**
     * @param costs n x k cost matrix
     * @return an integer, the minimum cost to paint all houses
     */
    int minCostII(vector<vector<int>>& costs) {
        // Write your code here
        int m=costs.size();
        if(m==0) return 0;
        int n=costs[0].size();
        vector<vector<int>> dp(2,vector<int>(n));
        int min1=INT_MAX,min2=INT_MAX;
        for(int i=0;i<n;i++) {
            dp[0][i]=costs[0][i];
            if(dp[0][i]<min1) {
                min2=min1;
                min1=dp[0][i];
            }
            else if(dp[0][i]<min2) {
                min2=dp[0][i];
            }
        }
        for(int i=1;i<m;i++) {
            for(int j=0;j<n;j++) {
                dp[i%2][j]=((dp[(i-1)%2][j]==min1)?min2:min1)+costs[i][j];
            }
            min1=min2=INT_MAX;     //别忘了更新min1,min2为INT_NAX,求新一行的最小值和第二小值
            for(int j=0;j<n;j++) {
                int t=dp[i%2][j];
                if(t<min1) {
                    min2=min1;
                    min1=t;
                }
                else if(t<min2) {
                    min2=t;
                }
            }
        }
        return min1;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值