📌  相关文章
📜  最小化油漆 N 间房屋的成本,使相邻房屋具有不同的颜色(1)

📅  最后修改于: 2023-12-03 14:55:21.259000             🧑  作者: Mango

最小化油漆 N 间房屋的成本,使相邻房屋具有不同的颜色

为了最小化油漆 N 间房屋的成本,前提是要保证相邻房屋的颜色不同,因此需要找到一种能够在满足相邻房屋颜色不同的前提下,使油漆成本最小化的方法。

首先,我们可以将每个房屋看作一个节点,每条边代表相邻的两个房屋,没有边则代表不相邻。则对于每一个房屋,它可以被涂上 k 种颜色之一,因此如果我们枚举每个房屋被涂上的颜色,则共有 k^N 种可能性。显然,暴力枚举的时间复杂度过高,不可取。

接下来,我们可以考虑利用动态规划来解决这个问题。假设我们已经确定了前 i-1 个房屋的颜色,并且它们已经满足相邻房屋颜色不同的条件。则,我们需要决定第 i 个房屋应该被涂上哪一种颜色。假设我们涂上颜色 j,则

  1. 如果第 i-1 个房屋被涂上了颜色 j,那么此时第 i 个房屋不能被涂上颜色 j;
  2. 否则,第 i 个房屋可以被涂上颜色 j。

因此,我们可以用二维数组 dp[i][j] 表示前 i 个房屋中,第 i 个房屋被涂上颜色 j 时的最小油漆成本。则状态转移方程为:

dp[i][j] = min{dp[i-1][k] + cost[i-1][j]}, 1 <= k <= k, k != j

其中,cost[i-1][j] 表示第 i 个房屋被涂上颜色 j 的油漆成本。

最终的结果为 dp[N][1:k] 中的最小值。

下面是一个 Python 代码片段实现了这个算法:

def minCost(cost: List[List[int]]) -> int:
    n = len(cost)
    k = len(cost[0])

    dp = [[0] * k for _ in range(n+1)]

    for i in range(1, n+1):
        for j in range(k):
            min_cost = float('inf')
            for l in range(k):
                if l != j:
                    min_cost = min(min_cost, dp[i-1][l])
            dp[i][j] = cost[i-1][j] + min_cost

    return min(dp[n])

返回结果为最小化油漆 N 间房屋的成本,使相邻房屋具有不同的颜色的最小成本。