256. Paint House
題目網址:https://leetcode.cn/problems/paint-house/
題意:假如有一排房子, 共
n
間, 每間房子可以被刷成紅、藍 、綠這三種顏色中的一種, 刷所有的房子, 並使其相鄰的兩間房子顏色不能相同。由於市場上不同顏色的油漆其價格是不同的, 所以房子刷成不同顏色的成本也是不同的。每間房子刷成不同顏色的花費是以一個
n x 3
的正整數 matrixcosts
來表示的。e.g.
costs[0][0]
表示第0
號房子刷成紅色的成本;costs[1][2]
表示第1
號房子刷成綠色的成本, 依此類推…計算刷完所有房子所需的最少花費。
Solution 1:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
costs
前先加上{0,0,0}
, 代表什麼元素都沒有的狀態dp[i][j]
為前i
間房子中, 其中第i
間房子刷成第j
種顏色所需的最少成本2. 得到狀態轉移方程:
dp[i][j] = min(dp[i - 1][(j + 1) % 3], dp[i - 1][(j + 2) % 3]) + costs[i][j]
若第
2
間房子刷成第1
種顏色, 則第1
間房子要選第0
和2
種顏色中成本較少的➔
dp[2][1] = min(costs[1][2], costs[1][0]) + costs[2][1]
3. 初始化:
dp[0][j]
:當沒有房子時, 將其刷成第j
種顏色的最小成本為0
dp[1][j]
:當只有一間房子時, 將其刷成第j
種顏色的最小成本為cost[1][j]
e.g.
costs = [[17,2,17],[16,16,5],[14,3,19]]
class Solution { |
- time:$O(n)$ ➔ for loop 需 $O(3 \cdot n)$ time
- space:$O(n)$ ➔
dp
需 $O(3 \cdot n)$ space
Solution 2:
想法:改進 Solution 1, 因為
dp[i][j]
只需用到第i - 1
次的狀態, 因此只需儲存上一次的狀態即可, 根本不需要開到 $O(n)$ space
class Solution { |
- time:$O(n)$ ➔ for loop 需 $O(3 \cdot n)$ time
- space:$O(1)$ ➔
dp
,nextRow
只需 $O(3)$ space
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論