Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 집 페인팅에 대한 최소 비용을 찾는 프로그램

<시간/>

크기가 m인 배열이 있다고 가정하고 작은 도시에 있는 m개의 주택을 나타내고 각 주택은 n개의 색상 중 하나로 칠해야 합니다(색상은 1에서 n까지 표시됨). 그리고 일부 주택은 이미 칠해져 있으므로 필요하지 않습니다. 다시 칠합니다. 같은 색으로 칠해진 집들을 이웃이라고 합니다. 우리는 배열 집이 있습니다. 여기서 집[i]은 집의 색상을 나타내고, 색상 값이 0이면 집이 아직 색칠되지 않았음을 나타냅니다. 비용이라는 또 다른 배열이 있습니다. 이것은 비용[i, j]이 색상 j+1로 집 i를 색칠하는 비용을 나타내는 2D 배열입니다. target이라는 또 다른 입력 값도 있습니다. 우리는 이웃의 목표 수와 정확히 일치하는 방식으로 나머지 모든 집을 페인팅하는 데 필요한 최소 비용을 찾아야 합니다. 솔루션을 얻을 수 없으면 -1을 반환합니다.

따라서 입력이 집과 같은 경우 =[0,2,1,2,0] 비용 =[[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가 대상과 같으면 0을 반환하고 그렇지 않으면 inf

  • house[i]가 0과 같지 않으면

    • return helper(i + 1, 집[i], grp + (p_col이 집[i]과 같지 않으면 1, 그렇지 않으면 0)

  • 총계 :=정보

  • 범위 1에서 n까지의 col에 대해 다음을 수행하십시오.

    • total =총계의 최소값 및 (cost[i, col - 1] + helper(i + 1, col, grp + (p_col이 col과 같지 않은 경우 1, 그렇지 않은 경우 0)))

  • 총 반환

  • 기본 방법에서 다음을 수행하십시오.

  • as :=도우미(0, -1, 0)

  • ans가 inf가 아닌 경우 반환, 그렇지 않으면 -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