房子1 | 房子2 | … | |
---|---|---|---|
红 | 14 | 11+min(2,11) | … |
蓝 | 2 | 14+min(14,11) | … |
绿 | 11 | 5+min(14,2) | … |
维护一个二维数组 res
,res[i][j]
表示该房子染某种颜色需要的最少钱。初始化房子一的三种颜色,之后房子二染红色需要的钱为min(房子一染蓝,房子一染绿)+房子二染红,以此类推。
function h(cost, n){
let res = []
res[0] = new Array(n)
res[1] = new Array(n)
res[2] = new Array(n)
res[0][0] = cost[0][0]
res[1][0] = cost[0][1]
res[2][0] = cost[0][2]
for(let j = 1; j < n; j++){
for(let i = 0;i < 3; i++){
// 选出上一个房子的那两个钱数
let arr = [res[0][j-1], res[1][j-1], res[2][j-1]].filter((item,index)=>index !== i)
res[i][j] = Math.min(...arr) + cost[j][i]
}
}
return Math.min(res[0][n-1],res[1][n-1],res[2][n-1])
}
const cost = [[14,2,11], [11,14,5], [14,3,10]]
h(cost, 3)