题目
1. 题目解析
题目地址:点这里
2. 讲解算法原理
-
创建dp表:vector<vector> dp(n, vector(3))。这里创建了一个二维向量dp,其中dp[i][j]表示第i天选择颜色j的最小成本。
-
初始化第一天的成本:for (int i = 0; i < 3; i++) { dp[0][i] = costs[0][i]; }。将第一天的成本设置为初始的颜色成本。
-
填表:使用循环遍历从第二天到最后一天,依次计算每天选择不同颜色的最小成本。
- dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i][0]:第i天选择颜色0的最小成本等于前一天选择颜色1和2的最小成本中的较小值加上当天选择颜色0的成本。
- dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i][1]:第i天选择颜色1的最小成本等于前一天选择颜色0和2的最小成本中的较小值加上当天选择颜色1的成本。
- dp[i][2] = min(dp[i - 1][1], dp[i - 1][0]) + costs[i][2]:第i天选择颜色2的最小成本等于前一天选择颜色1和0的最小成本中的较小值加上当天选择颜色2的成本。
-
返回结果:return min(dp[n - 1][0], min(dp[n - 1][1], dp[n - 1][2]))。返回最后一天选择不同颜色的最小成本中的最小值,即为最小成本。
3. 编写代码
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
int n=costs.size();
vector<vector<int>> dp(n,vector<int>(3));
for(int i=0;i<3;i++)dp[0][i]=costs[0][i];
if(n>1)
{
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][1],dp[i-1][0])+costs[i][2];
}
}
return min(dp[n-1][0],min(dp[n-1][1],dp[n-1][2]));
}
};
标签:颜色,min,最小,粉刷,---,算法,costs,成本,dp
From: https://blog.csdn.net/originalHSL/article/details/137194424