房子题库
粉刷房子
假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。
例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。
请计算出粉刷完所有房子最少的花费成本。
示例1:
输入: costs = [[17,2,17],[16,16,5],[14,3,19]]
输出: 10
解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。
最少花费: 2 + 5 + 3 = 10。
示例2:
输入: costs = [[7,6,2]]
输出: 2
方案 动态规划
思路:
- 状态定义: dp[i][j] 表示第i个房间染成颜色j的最小花费
- 状态转移方程:
dp[i][k] = min {dp[i - 1][0 1 2 except k] + costs[i][k]}
- 初始状态: dp[0][k] = costs[0][k] 第一个房子都 可以刷
- 问题答案
- 优化空间
:::details 点击查看代码
function minCost (costs) {
let len=costs.length;
if(len==0){
return 0;
}
let result=costs[len-1];
for(let i=len-2;i>=0;i--){
let dp=[...costs[i]];
dp[0]+=Math.min(result[1],result[2]);
dp[1]+=Math.min(result[0],result[2]);
dp[2]+=Math.min(result[0],result[1]);
result=dp;
}
return Math.min(...result);
};
:::
性能分析:
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。
粉刷房子 II
假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x k 的矩阵来表示的。
例如,costs[0][0] 表示第 0 号房子粉刷成 0 号颜色的成本花费;costs[1][2] 表示第 1 号房子粉刷成 2 号颜色的成本花费,以此类推。请你计算出粉刷完所有房子最少的花费成本。
注意:
所有花费均为正整数。
示例1:
输入: [[1,5,3],[2,9,4]]
输出: 5
解释: 将 0 号房子粉刷成 0 号颜色,1 号房子粉刷成 2 号颜色。最少花费: 1 + 4 = 5;
或者将 0 号房子粉刷成 2 号颜色,1 号房子粉刷成 0 号颜色。最少花费: 3 + 2 = 5.
方案 动态规划
思路:
- 状态定义: dp[i][j] 表示第i个房间染成颜色j的最小花费
- 状态转移方程:
dp[i][k] = min {dp[i - 1][0 1 2 except k] + costs[i][k]}
- 初始状态: dp[0][k] = costs[0][k] 第一个房子都可以刷
- 问题答案
- 优化空间
:::details 点击查看代码
function minCostII(costs) {
let len=costs.length;
if(len==0){
return 0;
}
let colorNum=costs[0].length;
let result=costs[len-1];
for(let i=len-2;i>=0;i--){
let dp=[...costs[i]];
for(let j=0;j<colorNum;j++){
dp[j]+=Math.min(...result.filter((value,index)=>index!==j));
}
result=dp;
}
return Math.min(...result);
};
:::
粉刷房子 III
在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n )。有的房子去年夏天已经涂过颜色了,所以这些房子不可以被重新涂色。
我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,1,1] ,它包含 5 个街区 [1, 2, 3, 2, 1] 。)
给你一个数组 houses ,一个 m * n 的矩阵 cost 和一个整数 target ,其中:
houses[i]:是第 i 个房子的颜色,0 表示这个房子还没有被涂色。 cost[i][j]:是将第 i 个房子涂成颜色 j+1 的花费。 请你返回房子涂色方案的最小总花费,使得每个房子都被涂色后,恰好组成 target 个街区。如果没有可用的涂色方案,请返回 -1 。
示例1:
输入:houses = [0,0,0,0,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3
输出:9
解释:房子涂色方案为 [1,2,2,1,1]
此方案包含 target = 3 个街区,分别是 [{1}, {2,2}, {1,1}]。
涂色的总花费为 (1 + 1 + 1 + 1 + 5) = 9。
示例2:
输入:houses = [0,2,1,2,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3
输出:11
解释:有的房子已经被涂色了,在此基础上涂色方案为 [2,2,1,2,2]
此方案包含 target = 3 个街区,分别是 [{2,2}, {1}, {2,2}]。
给第一个和最后一个房子涂色的花费为 (10 + 1) = 11。
示例3:
输入:houses = [0,0,0,0,0], cost = [[1,10],[10,1],[1,10],[10,1],[1,10]], m = 5, n = 2, target = 5
输出:5