题目描述
假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,不同颜色粉刷的成本不一样。 你需要粉刷所有的房子,相邻的两个房子颜色不能相同。
costs[i][0]:第i栋房子刷红色的花费 costs[i][1]:第i栋房子刷蓝色的花费 costs[i][2]:第i栋房子刷绿色的花费
求粉刷完所有房子的最低总花费。
限制:只能红、蓝、绿三色,相邻房子颜色不能一样。
核心思路
动态规划,状态定义:
dp1[i]:粉刷完第i栋房子,第 i 栋刷红色的最小总开销dp2[i]:粉刷完第i栋房子,第 i 栋刷蓝色的最小总开销dp3[i]:粉刷完第i栋房子,第 i 栋刷绿色的最小总开销

cpp
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
int n=costs.size();
vector<int>dp1(n,0);
vector<int>dp2(n,0);
vector<int>dp3(n,0);
dp1[0]=costs[0][0];
dp2[0]=costs[0][1];
dp3[0]=costs[0][2];
for(int i=1;i<n;i++)
{
dp1[i]=min(dp2[i-1],dp3[i-1])+costs[i][0];
dp2[i]=min(dp1[i-1],dp3[i-1])+costs[i][1];
dp3[i]=min(dp2[i-1],dp1[i-1])+costs[i][2];
}
return min(dp1[n-1],min(dp2[n-1],dp3[n-1]));
}
};