1473. Paint House III

https://leetcode.com/problems/paint-house-iii/

use lru cache 50% faster

from functools import lru_cache
class Solution:
    def minCost(self, houses: List[int], cost: List[List[int]], m: int, n: int, target: int) -> int:
        @lru_cache(None)
        def dp(i,color,partition):
            if partition > target:
                return float("inf")
            if i == m:
                if partition == target:
                    return 0
                else:
                    return float("inf")
            
            if houses[i]:
                return dp(i+1,houses[i],partition+(houses[i] != color))
            res = float("inf")
            for c, currCost in enumerate(cost[i],1):
                res = min(res,currCost + dp(i+1,c,partition + (c != color)))
            return res
        
        ans = dp(0,0,0)
        if ans == float("inf"):
            return -1
        return ans

self made cache dictionary 25% faster

class Solution:
    def minCost(self, houses: List[int], cost: List[List[int]], m: int, n: int, target: int) -> int:
        self.cache = dict()
        def dp(i,color,partition):
            if (i,color,partition) in self.cache:
                return self.cache[(i,color,partition)]
            if partition > target:
                self.cache[(i,color,partition)] = float("inf")
                return float("inf")
            if i == m:
                if partition == target:
                    self.cache[(i,color,partition)] = 0
                    return 0
                else:
                    self.cache[(i,color,partition)] = float("inf")
                    return float("inf")
            
            if houses[i]:
                return dp(i+1,houses[i],partition+(houses[i] != color))
            res = float("inf")
            for c, currCost in enumerate(cost[i],1):
                res = min(res,currCost + dp(i+1,c,partition + (c != color)))
            self.cache[(i,color,partition)] = res
            return res
        
        ans = dp(0,0,0)
        if ans == float("inf"):
            return -1
        return ans

Last updated

Was this helpful?