用 Python 编写程序,查找粉刷房屋的最低成本

pythonserver side programmingprogramming更新于 2025/11/30 16:12:17

假设有一个大小为 m 的数组,表示一个小城市中的 m 栋房屋,每栋房屋必须涂上 n 种颜色中的一种(颜色从 1 到 n 标记),有些房屋已经涂过漆,因此无需再次涂漆。涂上相同颜色的房屋称为邻域。我们有数组 houses,其中 houses[i] 表示房屋的颜色,如果颜色值为 0,则表示房屋尚未上漆。我们还有另一个数组称为 cost,这是一个二维数组,其中 cost[i, j] 表示将房屋 i 涂上颜色 j+1 的成本。我们还有另一个输入值称为 target。我们必须找到粉刷所有剩余房屋所需的最低成本,以便恰好有目标数量的邻域。如果无法得到解决方案,则返回 -1。

因此,如果输入为 houses = [0,2,1,2,0] cost = [[1,10],[10,1],[10,1],[1,10],[5,1]] n = 2 target = 3,则输出将为 11,因为有些房屋已经粉刷过了,因此我们必须以 [2,2,1,2,2] 这样的方式粉刷房屋,有三个街区,[{2,2}, {1}, {2,2}]。粉刷第一栋和最后一栋房屋的总成本 (10 + 1) = 11。

为了解决这个问题,我们将遵循以下步骤 −

  • m := 房屋大小

  • 定义一个函数 helper() 。这将需要 i、p_col、grp

  • 如果 i 与 m 相同,则

    • 如果 grp 与 target 相同,则返回 0,否则为 inf

  • 如果 houses[i] 不等于 0,则

    • 如果 p_col 与 houses[i] 不同,则返回 helper(i + 1, houses[i], grp + (1,如果 p_col 与 houses[i] 不同,否则为 0)

  • total := inf

  • 对于范围从 1 到 n 的 col,执行

    • total = total 和 (cost[i, col - 1] + helper(i + 1, col, grp + (1 当 p_col与 col 不同,否则为 0)))

  • 返回总计

  • 从主方法执行以下操作

  • ans := helper(0, -1, 0)

  • 如果 ans 不是 inf,则返回 ans,否则返回 -1

示例

让我们看看下面的实现以便更好地理解

def solve(houses, cost, n, target):
   m = len(houses)

   def helper(i, p_col, grp):
      if i == m:

         return 0 if grp == target else float('inf')

      if houses[i] != 0:
         return helper(i + 1, houses[i], grp + int(p_col != houses[i]))

      total = float('inf')
      for col in range(1, n + 1):
         total = min(total, cost[i][col - 1] + helper(i + 1, col, grp + int(p_col != col)))

      return total

   ans = helper(0, -1, 0)
   return ans if ans != float('inf') else -1

houses = [0,2,1,2,0]

cost = [[1,10],[10,1],[10,1],[1,10],[5,1]]

n = 2

target = 3

print(solve(houses, cost, n, target))

输入

[0,2,1,2,0], [[1,10],[10,1],[10,1],[1,10],[5,1]], 2, 3

输出

11

相关文章


有用资源