題目描述:
假如有一排房子,共 n 個,每個房子可以被粉刷成 k 種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。
當然,因為市場上不同顏色油漆的**不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以乙個 n x k 的矩陣來表示的。
例如,costs[0][0] 表示第 0 號房子粉刷成 0 號顏色的成本花費;costs[1][2] 表示第 1 號房子粉刷成 2 號顏色的成本花費,以此類推。請你計算出粉刷完所有房子最少的花費成本。
注意:
所有花費均為正整數。
示例:
輸入: [[1,5,3],[2,9,4]]
輸出: 5
解釋: 將 0 號房子粉刷成 0 號顏色,1 號房子粉刷成 2 號顏色。最少花費: 1 + 4 = 5;
或者將 0 號房子粉刷成 2 號顏色,1 號房子粉刷成 0 號顏色。最少花費: 3 + 2 = 5.
高階:
您能否在 o(nk) 的時間複雜度下解決此問題?
方法1:
主要思路:
(1)沒有優化的動態規劃;
(2)將動態陣列 dp[ i ][ j ]表示第 i 個房子 塗第 j 種顏色時,可以獲得的最小的成本,則dp[ i ][ j ] 的動態值相當於要從上乙個房子下的可以獲得的所有可能中的選項中,選出乙個最下值,加上當前的 costs[ i ][ j ]即可;
class
solution
//標識行列變數
int rows=costs.
size()
;int cols=costs[0]
.size()
; vectorint>>
dp(rows,vector<
int>
(cols,int_max));
//動態陣列
//初始化
for(
int i=
0;i++i)
//遍歷各個動態陣列的元素
for(
int i=
1;i++i)
} dp[i]
[j]+
=costs[i]
[j];
//加上當前的消耗,既 costs[i][j]}}
int res=int_max;
//從最後一行,既最後乙個房子的所有的可能性中找出最小值
for(
int i=
0;i++i)
return res;
//返回最小值}}
;
class
solution
//標識行列
int rows=costs.
size()
;int cols=costs[0]
.size()
;//動態陣列
vectorint>>
dp(rows,vector<
int>
(cols,int_max));
//標識上一行,既上乙個房子的各個可能的顏色下,獲得最小值和第二小的值,既對應的索引
pair<
int,
int> first_min=
; pair<
int,
int> second_min=
;//初始化第一行
for(
int i=
0;i++i)
else
if(costs[0]
[i]<=second_min.first)
}//遍歷後面的動態陣列的各個元素
for(
int i=
1;i++i)
; pair<
int,
int> cur_second_min=
;for
(int j=
0;j++j)
else
//根據當前行,既當前房子的塗的當前顏色,獲得的最小值,來更新當前行,既當前房可能獲得最下值和第二小的值
if(dp[i]
[j]<=cur_fisrt_min.first)
else
if(dp[i]
[j]<=cur_second_min.first)
}//更新最小值和第二小的值
first_min=cur_fisrt_min;
second_min=cur_second_min;
}//找出最後一行在可能的各個顏色下獲得的最小值中的最小值
int res=int_max;
for(
int i=
0;i++i)
return res;
//返回結果}}
;
265 粉刷房子 II
首先這題可以和粉刷房子這題一樣解法,對於i號房子,遍歷k種顏色,對於每一種,都去找i 1號房子除該顏色之外的最小花費。但上一題是3種顏色,總複雜度o n 這題k種顏色,複雜度o nk 2 題目要求o nk 則對於i號房子我們儲存下當前房子最小的花費以備i 1號房子使用,但因為相鄰房子不能塗相同顏色的...
DP LeetCode265 粉刷房子 II
同類題 leetcode256.粉刷房子 序列型 假如有一排房子,共 n 個,每個房子可以被粉刷成k 種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。當然,因為市場上不同顏色油漆的 不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以乙個 n x...
Leetcode 265 粉刷房子2
hard難度,思路和256幾乎完全相同,先初始化第一排然後用動態轉移方程,但是難點在於題目中要求time complexity為o k n 如果用for迴圈來尋找前一排的最小值花費過大,我使用的是arrays.sort 時間複雜度為o logn 找到最小值以後和當前值的上一排做對比,來確定上一排的最...