示例一解释:
0表示红色,1表示蓝色,2表示绿色
给的costs的每一个数组代表一个房子刷三种颜色的花费
1.状态表示
是什么?dp表中里的值所表示的含义就是状态表示
粉刷到dp[i]位置有三种情况,就是把i位置的房子刷三种颜色
dp[i][0]表示:粉刷到i位置时,最后一个位置粉刷上红色,此时的最小花费
dp[i][1]表示:粉刷到i位置时,最后一个位置粉刷上蓝色,此时的最小花费
dp[i][2]表示:粉刷到i位置时,最后一个位置粉刷上绿色,此时的最小花费
2.状态转移方程
dp[i] 等于什么
根据i位置刷不同的颜色,可分为三种情况
1.i位置刷红色
dp[i][0] = min(dp[i-1][1] , dp[i-1][2]) + costs[i][0]
同理可得
2.i位置刷蓝色
dp[i][1] = min(dp[i-1][0],dp[i-1][2]) + costs[i][1]
3.i位置刷绿色
dp[i][2] = min(dp[i-1][0],dp[i-1][1]) + costs[i][2]
3.初始化
保证填表的时候不越界
在表前加一个虚拟节点(多创建一个位置)然后把虚拟节点的值设置为0
4.填表顺序
为了填写当前状态的时候,所需要的状态已经计算过了
从左往右,一次填写三个表
5.返回值
题目要求+状态表示
min(dp[n][0],dp[n][1],dp[n][2])
6.代码
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
int n = costs.size();
//1.创建dp表
vector<vector<int>> dp(n+1,vector<int>(3));
//2.初始化
//3.填表
for(int i = 1;i < n+1;i++)
{
dp[i][0] = min(dp[i-1][1],dp[i-1][2]) + costs[i-1][0];
//计算costs[i]位置要i-1因为有虚拟节点
dp[i][1] = min(dp[i-1][0],dp[i-1][2]) + costs[i-1][1];
dp[i][2] = min(dp[i-1][0],dp[i-1][1]) + costs[i-1][2];
}
//4.返回值
return min(dp[n][0],min(dp[n][1],dp[n][2]));
}
};