256. Paint House

第一个想法是:

class Solution(object):
    def minCost(self, costs):
        """
        :type costs: List[List[int]]
        :rtype: int
        f(k)
        color(k)
        ? l = k + 1
        f(l) = f(k) + cost(argmin([r, g, b] - color(k)))
        """

        pre = -1
        res = 0
        for cost in costs:
            idx = 0
            imin = cost[0]
            for i, c in enumerate(cost):
                if i == pre:
                    continue
                else:
                    if imin > c:
                        idx = i
                        imin = c

            res += imin
            pre = idx

        return res

上面这种想法,忽略了:[[17,2,17],[16,16,5],[14,3,19]] 每次有多个单次最优的解。

第二个想法,每次记录所有的 cost

class Solution(object):
    def minCost(self, costs):
        """
        :type costs: List[List[int]]
        :rtype: int

        """
        pre = [0,0,0]

        for cost in costs:
            pre = [cost[0] + min(pre[1:]), cost[1] + min(pre[0], pre[2]), cost[2] + min(pre[:2])]
        return min(pre)

这个思路的想法是,取之前的最小符合条件的值没有问题,但是当前的选取的最优值的下标,对后面的值的选择是有影响的。 如果只考虑当前的最优解,那么就会忽略下一个 cost 相同位置的值。

[[1, 200], [200, 500] 如果选择 costs[0][0],第二个值必然是 costs[1][1]。显然是不合适的。

results matching ""

    No results matching ""