There are a row of n houses, each house can be painted with one of the three colors: red, blue or green. 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 3
cost matrix. For example, costs[0][0]
is the cost of painting house 0 with color red; costs[1][2]
is the cost of painting house 1 with color green, and so on... Find the minimum cost to paint all houses.
Note:
All costs are positive integers.
All costs are positive integers.
Example:
Input: [[17,2,17],[16,16,5],[14,3,19]] Output: 10 Explanation: Paint house 0 into blue, paint house 1 into green, paint house 2 into blue. Minimum cost: 2 + 5 + 3 = 10.
class Solution {
public:
/*
int minCost(vector<vector<int>>& costs) {
if (costs.size() == 0) {
return 0;
}
int size = costs[0].size();
vector<int> helper = costs[0];
for (int i = 1; i < costs.size(); i++) {
vector<int> tmp(size, 0);
tmp[0] = costs[i][0] + min(helper[1], helper[2]);
tmp[1] = costs[i][1] + min(helper[0], helper[2]);
tmp[2] = costs[i][2] + min(helper[1], helper[0]);
helper = tmp;
tmp.clear();
}
int ans = INT_MAX;
for (auto num : helper) {
ans = min(ans, num);
}
return ans;
}
*/
int minCost(vector<vector<int>>& costs) {
if (costs.size() == 0) {
return 0;
}
int size = costs[0].size();
for (int i = 1; i < costs.size(); i++) {
vector<int> tmp(size, 0);
costs[i][0] = costs[i][0] + min(costs[i-1][1], costs[i-1][2]);
costs[i][1] = costs[i][1] + min(costs[i-1][0], costs[i-1][2]);
costs[i][2] = costs[i][2] + min(costs[i-1][1], costs[i-1][0]);
}
int ans = INT_MAX;
for (auto num : costs[costs.size() - 1]) {
ans = min(ans, num);
}
return ans;
}
};
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
if(costs.empty()) return 0;
int red=costs[0][0];
int blue=costs[0][1];
int green=costs[0][2];
for(int i=1;i<costs.size();i++){
int t_red=red;
int t_blue=blue;
int t_green=green;
red=min(t_blue,t_green)+costs[i][0];
blue=min(t_red,t_green)+costs[i][1];
green=min(t_red,t_blue)+costs[i][2];
}
return min(green,min(red,blue));
}
};
No comments:
Post a Comment