Suppose we want to paint a row of N fences with K different colors. We want to minimize the cost while ensuring that no two neighboring fences are of the same color. So if we have an N x K matrix where the nth row and kth column represents the cost to paint the nth fence with kth color, we have to find the minimum cost which achieves this goal.
So, if the input is like
6 | 4 | 5 |
3 | 2 | 7 |
3 | 4 | 5 |
5 | 4 | 4 |
then the output will be 14, as we can select the following color indices (starting from the first fence) − 5 → 2 → 3 → 4.
To solve this, we will follow these steps −
n := row count of matrix
fc := 0, ft := 0
sc := 1, st := 0
for each row in matrix, do
nfc := -1, nft := inf
nsc := -1, nst := inf
for each index i and value t row, do
ct := t +(ft if i is not same as fc otherwise st)
if ct <= nft, then
nsc := nfc, nst := nft
nfc := i, nft := ct
otherwise when ct <= nst, then
nsc := i, nst := ct
fc := nfc, ft := nft
sc := nsc, st := nst
return ft
Example
Let us see the following implementation to get better understanding −
class Solution: def solve(self, matrix): n = len(matrix) fc, ft = 0, 0 sc, st = 1, 0 inf = int(1e18) for row in matrix: nfc, nft = -1, inf nsc, nst = -1, inf for i, t in enumerate(row): ct = t + (ft if i != fc else st) if ct <= nft: nsc, nst = nfc, nft nfc, nft = i, ct elif ct <= nst: nsc, nst = i, ct fc, ft = nfc, nft sc, st = nsc, nst return ft ob = Solution() matrix = [ [6, 4, 5], [3, 2, 7], [3, 4, 5], [5, 4, 4] ] print(ob.solve(matrix))
Input
[ [6, 4, 5], [3, 2, 7], [3, 4, 5], [5, 4, 4] ]
Output
14