How to Paint The Houses using Minimal Costs via Dynamic Programming Algorithm?


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.

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.

This problem is very much alike the C/C++ Coding Exercise – House Robber – Dynamic Programming except the Dynamic Equation is slightly a bit different.

Dynamic Programming to Paint the Houses using the Minimal Costs

The DP equation is:

1
2
3
4
f[i][0] = min(f[i - 1][1], f[i - 1][2]) + costs[i][0]; // when paint house i with color 0
f[i][1] = min(f[i - 1][2], f[i - 1][0]) + costs[i][1]; // when paint house i with color 1
f[i][2] = min(f[i - 1][0], f[i - 1][1]) + costs[i][2]; // when paint house i with color 2
Ans = min(f[j][0], f[j][1], f[j][2]); // where j is n - 1
f[i][0] = min(f[i - 1][1], f[i - 1][2]) + costs[i][0]; // when paint house i with color 0
f[i][1] = min(f[i - 1][2], f[i - 1][0]) + costs[i][1]; // when paint house i with color 1
f[i][2] = min(f[i - 1][0], f[i - 1][1]) + costs[i][2]; // when paint house i with color 2
Ans = min(f[j][0], f[j][1], f[j][2]); // where j is n - 1

f[i][x] is the minimal costs painting up to house i using color x. Apparently, it equals to the minimal cost of the previous houses f[i-1][y] where y is not x, plus the current cost of painting the house i with color x.

The following C++ code implements the Dynamic Programming, in O(N) time and O(N) space.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        int n = costs.size();
        if (n == 0) return 0;
        vector<vector<int>> f(n, vector<int>(3, INT_MAX));
        f[0][0] = costs[0][0];
        f[0][1] = costs[0][1];
        f[0][2] = costs[0][2];
        for (int i = 1; i < n; ++ i) {
            f[i][0] = min(f[i - 1][1], f[i - 1][2]) + costs[i][0];
            f[i][1] = min(f[i - 1][2], f[i - 1][0]) + costs[i][1];
            f[i][2] = min(f[i - 1][0], f[i - 1][1]) + costs[i][2];
        }
        return min(f[n - 1][0], min(f[n - 1][1], f[n - 1][2]));
    }
};
class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        int n = costs.size();
        if (n == 0) return 0;
        vector<vector<int>> f(n, vector<int>(3, INT_MAX));
        f[0][0] = costs[0][0];
        f[0][1] = costs[0][1];
        f[0][2] = costs[0][2];
        for (int i = 1; i < n; ++ i) {
            f[i][0] = min(f[i - 1][1], f[i - 1][2]) + costs[i][0];
            f[i][1] = min(f[i - 1][2], f[i - 1][0]) + costs[i][1];
            f[i][2] = min(f[i - 1][0], f[i - 1][1]) + costs[i][2];
        }
        return min(f[n - 1][0], min(f[n - 1][1], f[n - 1][2]));
    }
};

The minimal cost will be the minimal of three different choices: painting the last house with 3 different colours.

In next post, we are going to use the same algorithm to count the permutation: Compute the Number of Ways to Paint the House via Dynamic Programming Algorithm

–EOF (The Ultimate Computing & Technology Blog) —

GD Star Rating
loading...
515 words
Last Post: Relative Sort Array Algorithm: Sort Array Based on Predefined Sequence
Next Post: Compute the Number of Ways to Paint the House via Dynamic Programming Algorithm

The Permanent URL is: How to Paint The Houses using Minimal Costs via Dynamic Programming Algorithm?

Leave a Reply