LeetCode 265. Paint House II

原创 2016年06月02日 06:41:37
#include <vector>
#include <iostream>
#include <climits>
using namespace std;

/*
  Here 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 n * k color
  matrix. For example, costs[0][0] is the cost of painting house 0 with color 0'
  cost[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.
*/
// The dynamic equation is dp[i][j] = min(dp[i-1][m]) + cost[i][j])
// dp[i][j] means the total cost of painting ith house with jth color.
// i is in (0, n), j is in (0, k),  m is in (0, k) but m != j;
// this is the most stupid method: Time Complexity (O(K*K*N)), Space: O(K*N)
int minCostII(vector< vector<int> >& costs) {
  int m = costs.size();
  int n = costs[0].size();
  vector< vector<int> > dp(m, vector<int>(n, 0));
  for(int i = 0; i < m; ++i) {
    dp[i][0] = costs[i][0];
  }
  for(int i = 1; i < n; ++i) {
    for(int j = 0; j < m; ++j) {
      int tmp = INT_MAX;
      for(int c = 0; c < m; ++c) {
        if(c == j) continue;
        tmp = min(tmp, dp[c][i-1]);
      }
      dp[j][i] = tmp + costs[j][i];
    }
  }
  int minCost = INT_MAX;
  for(int i = 0; i < m; ++i) {
    minCost = min(minCost, dp[i][n-1]);
  }
  return minCost;
}
// Since we dont need to save every already computed house state, to save time complexity and space complexity. Right now, time complexity lowers to O(N*K), Space to O(K)
int minCostIII(vector< vector<int> >& costs) {
  if(costs.size() == 0) return 0;
  int m = costs.size(), n = costs[0].size();
  vector<int> dp(costs[0]); // initalize with the first row. First make all the house choose color 0.
  for(int i = 1; i < m; ++i) {  // second colour is used to paint house k with low cost of paint color 0.  
    vector<int> down(n, INT_MAX);
    vector<int> up(n, INT_MAX);
    for(int j = 1; j < n; ++j) {
      down[j] = min(down[j-1], dp[j-1]);
    }
    for(int j = n - 2; j >= 0; --j) {
      up[j] = min(up[j+1], dp[j+1]);
    }
    for(int j = 0; j < n; ++j) {
      dp[j] = min(up[j], down[j]) + costs[i][j];
    }
  }
  int minValue = INT_MAX;
  for(int i= 0; i < n; ++i) {
    minValue = min(minValue, dp[i]);
  }
  return minValue;
}

int main(void) {
  vector< vector<int> > costs{
    {1, 2, 3},
    {3, 2, 1},
    {2, 2, 4}};
  cout << minCostII(costs) << endl;
  cout << minCostIII(costs) << endl;
}

I was asked a similar question in interviewing Google. The question was put as "An employee want to take the maximum holiday days. He can fly to any country to enjoy the holiday every week, with no care about air plane ticket cost". Given the maximum holiday days each week, he can only fly to K countries, compute how to plan the routine to enjoy the most. To solve this question is almost the same as above. 

版权声明:欢迎转载

相关文章推荐

[leetcode] 265. Paint House II 解题报告

题目链接:https://leetcode.com/problems/paint-house-ii/ here are a row of n houses, each house can b...

[Leetcode] 265. Paint House II 解题报告

题目: There are a row of n houses, each house can be painted with one of the k colors. The cost o...

Leetcode 256. Paint House & 265. Paint House II

256. Paint House Total Accepted: 12390 Total Submissions: 27614 Difficulty: Medium There a...

[Leetcode]Paint House

There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr...

Leetcode 256. Paint House (Medium) (cpp)

Leetcode 256. Paint House (Medium) (cpp)
  • Niko_Ke
  • Niko_Ke
  • 2016年12月24日 14:27
  • 270

LeetCode 256. Paint House(房子涂色)

原题网址:https://leetcode.com/problems/paint-house/ There are a row of n houses, each house can be pai...
  • jmspan
  • jmspan
  • 2016年04月09日 05:05
  • 614

<LeetCode OJ> (198 / 213) House Robber(I / II)

House Robber My Submissions Question Total Accepted: 45702 Total Submissions: 142460 Difficulty:...

[leetcode 213]House Robber II

Note: This is an extension of House Robber. After robbing those houses on that street, the thief ha...

leetcode - 198,213. House Robber(II) & 91. Decode Ways

算法系列博客之Dynamic Programming 本篇博客将运用动态规划的思想来解决leetcode上198和213号问题 问题描述:198 House RobberYou are a pr...
  • Quiteen
  • Quiteen
  • 2017年06月11日 15:09
  • 90

LeetCode House Robber I and II

在这里,我将这两题放在一起来解决,因为这两道都是在Dynamic Programming(动态规划)的类型里面,所以放在一起比较好,只是第二题比第一题多了一个条件,其他都是一样的。 首先是第一题: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode 265. Paint House II
举报原因:
原因补充:

(最多只允许输入30个字)