いいえ、それはNP困難ではありません(技術的には、これは決定問題ではないため、「NP完全」はこれに対して間違った用語です)。
動的計画法は機能し、O(n)時間アルゴリズムを提供します。(nは家の数です)。
あなたは3つの配列R[1..n], B[1..n], G[1..n]
を維持します。ここで、は赤に着色されたR[i]
家1、2、3...を塗装するための最小コストですi
。i
同様にB[i]
、1、2 ...i
をi
青に着色G[i]
し、i
緑に着色する場合の最小コストです。
あなたは計算することができますR[i+1]
:
R[i+1]= (Cost of painting house i+1 Red) + minimum {G[i], B[i]}
。
同様にB[i+1]
、G[i+1]
計算することができます。
最終的には、の最小値を取りますR[n], B[n] and G[n]
。
これはO(n)時間とO(n)空間です。
たとえば、住宅の次のコストマトリックスについて考えてみます。
ハウス番号:1 2 3
R:1 4 6
G:2 100 2
B:3 100 4
アルゴリズムは、答えを得るために次のマトリックスを構築しています。
住宅:0 1 2 3
R:0 1 6107
G:0 2 101 8
B:0 3 101 10
3つの家すべてが塗装されている最後の列から、最小コストを見つけることができます。これは8に等しく、[緑(2)、赤(4)、緑(2)]の組み合わせに対応します。
クイックPython:
# rc = costs of painting red, bc of blue and gc of green.
def min_paint(rc, bc, gc):
n, i = len(rc), 1
r, b, g = [0]*n, [0]*n, [0]*n
r[0], b[0], g[0] = rc[0], bc[0], gc[0]
while i < n:
r[i] = rc[i] + min(b[i-1], g[i-1])
b[i] = bc[i] + min(r[i-1], g[i-1])
g[i] = gc[i] + min(b[i-1], r[i-1])
i += 1
return min(r, b, g)
def main():
print min_paint([1, 4, 6], [2, 100, 2], [3, 100, 4])
if __name__ == "__main__":
main()
出力は([1、6、107]、[2、101、8]、[3、101、10])になります。これは、ソリューションにつながるコストマトリックスです。