LeetCode 265. Paint House II
2016-06-02 06:41
495 查看
#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.
相关文章推荐
- retain assign copy在@propeerty中的使用实际上是通过控制set方法进行内存管理
- hotmail黑名单申诉
- NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
- 报错:Conversion to Dalvik format failed: Unable to execute dex:
- CodeForces 362B Petya and Staircases
- scala学习trait
- nexus私服update repair index索引失败解决方案
- leetcode_336 Palindrome Pairs
- leetcode 11. Container With Most Water-最大容器|双指针
- Could not generate DH keypair(httpclient)
- 【Leetcode】Factorial Trailing Zeroes
- Task.ConfigureAwait
- 70. Climbing Stairs
- saltstack- grains.filter_by-介绍
- saltstack- grains.filter_by-介绍
- http://a.codekk.com/detail/Android/grumoon/Volley 源码解析
- 打开netlogo model 出现failed to launch JVM
- foxmail7版本按照主题排序无法查看
- mongodb执行计划Explain分析实例(转载)
- final link failed: Nonrepresentable section on output的解决办法