在Python中查找油漆房屋的最小成本的程序

在Python中查找油漆房屋的最小成本的程序

假设有一个大小为m的数组,表示小城市中的m个房屋,每个房屋必须用n种颜色之一(颜色标号从1到n),并且某些房屋已经被粉刷过了,因此不需要再次进行粉刷。用同一种颜色涂色的房屋被称为邻居。我们有houses数组,其中houses [i]表示房屋的颜色,如果颜色值为0,则表示房屋尚未着色。我们还有另一个称为costs的数组,这是一个二维数组,其中costs [i,j]表示涂漆房屋i为颜色j + 1的成本。我们还有另一个输入值称为target。我们必须找到绘制所有剩余房屋所需的最小成本,使得恰好存在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:=几个房子

  • 定义帮助器函数。这将取i,p_col,grp

  • 如果i与m相同,则

    • 如果grp与target相同,则返回0,否则返回inf
  • 如果houses [i]与0不同,则
    • 返回helper(i + 1,houses [i],grp +(1 if p_col与houses [i]不同,否则为0)
  • 总计:= inf

  • 对于范围在1到n之间的col,做

    • total =最小的总和(cost [i,col-1] + helper(i + 1,col,grp +(1 when 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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程