一.题目介绍 ![](https://img-blog.csdnimg.cn/d0cc7207c9ac454f921ee5b775cf7207.png)
二.题目分析
题目虽长,但是题意比较简单,我用一张图来方便解释:
所以我们在设状态时用二维数组dp[ i ][ j ] (0 <= j <=3) ,其中dp[ i ][ 0 ]表示在 i层时粉刷红房子时最少的花费费用,dp[ i ][ 1 ]和dp[ i ][ 2 ]同理。最后返回这三列中的最小值。
三.完整代码
int minCost(vector<vector<int>>& costs)
{
int n = costs.size();
vector<vector<int>> dp(n, vector<int>(3));
dp[0][0] = costs[0][0], dp[0][1] = costs[0][1], dp[0][2] = costs[0][2];
for(int i = 1; i < n; i++)
{
dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + costs[i][0];
dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + costs[i][1];
dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + costs[i][2];
}
return min(dp[n-1][0], min(dp[n-1][1], dp[n-1][2]));
}