1.题目来源
题目来源:LCR.091.粉刷房子——力扣
测试用例
2.算法原理
下列矩阵表示粉刷每个房子的费用,对应颜色表示粉刷的油漆颜色
1.状态表示
创建一个n×3的dp表,每一列代表第i个房子刷三个颜色中任意颜色的情况下花费的费用
dp[i][0]:第i个房子粉刷红色油漆时花费的总费用
dp[i][1]:第i个房子粉刷蓝色油漆时花费的总费用
dp[i][2]:第i个房子粉刷绿色油漆时花费的总费用
2.状态转移方程
当第i个房子刷完油漆,前面一个房子一定刷其他两种颜色的油漆之一,那么就转化为求前一个房子刷油漆的费用+第i个房子刷油漆的费用,即
dp[i][0]=costs[i-1][0] + min(dp[i-1][1],dp[i-1][2]);第i个房子刷红色
dp[i][1]=costs[i-1][1] + min(dp[i-1][0],dp[i-1][2]);第i个房子刷蓝色
dp[i][2]=costs[i-1][2] + min(dp[i-1][0],dp[i-1][1]);第i个房子刷绿色
3.初始化
这里使用了一个虚拟位置来直接在循环中初始化第一个位置,虚拟位置的值为0
4.填表顺序
由于每一个位置都需要访问前一个位置,所以从左到右填表
5.返回值
返回最后一个房子刷某种油漆时的最小花费
即return min(dp[n][0],min(dp[n][1],dp[n][2]));
3.实战代码
class Solution {
public:
int minCost(vector<vector<int>>& costs)
{
int n = costs.size();
vector<vector<int>> dp(n+1,vector<int>(3));
for(int i = 1;i <= n;i++)
{
dp[i][0] = min(dp[i-1][1],dp[i-1][2]) + costs[i-1][0];
dp[i][1] = min(dp[i-1][0],dp[i-1][2]) + costs[i-1][1];
dp[i][2] = min(dp[i-1][1],dp[i-1][0]) + costs[i-1][2];
}
return min(dp[n][0],min(dp[n][1],dp[n][2]));
}
};