假设我们连续有n座房屋,现在每座房屋都可以用k种颜色之一绘制。具有某种颜色的每个房屋的绘画成本是不同的。现在我们要记住,我们必须对所有房屋进行粉刷,以使两个相邻的房屋都没有相同的颜色。
用nx k阶矩阵表示用某种颜色粉刷每所房屋的成本。而且,我们必须找到粉刷所有房屋的最低成本。
所以,如果输入像
| 1 | 5 | 3 |
| 2 | 9 | 4 |
则输出为5,将油漆房0变为颜色0,将油漆房1变为颜色2。则最小成本为1 + 4 = 5;或将房屋0涂成颜色2,将房屋1涂成颜色0。最低成本为3 + 2 = 5。
为了解决这个问题,我们将遵循以下步骤-
n:=成本行大小
m:=(如果n不为零,则表示成本的col大小,否则为0)
ret:= inf
对于初始化i:= 1,当i <n时,更新(将i增加1),-
左:=(如果j-1> = 0,则为lmins [j-1],否则为inf)
右:=(如果j + 1 <m,则rmins [j + 1],否则inf)
成本[i,j]:=成本[i,j] +分钟(左,右)
rmins [j]:=成本[i-1,j]和rmins [j +1]的最小值
lmins [j]:=成本[i-1,j]和lmins [j-1]的最小值
要求:= inf
定义大小为m的数组lmins
定义大小为m的数组rmins
lmins [0]:=费用[i-1,0]
rmins [m-1] =费用[i-1,m-1]
对于初始化j:= 1,当j <m时,更新(将j增加1),-
对于初始化j:= m-2,当j> = 0时,更新(将j减1),执行-
对于初始化j:= 0,当j <m时,更新(将j增加1),执行-
对于初始化i:= 0,当i <m时,更新(将i增加1),执行-
ret:=最小的ret和成本[n-1,i]
返回(如果ret与inf相同,则为0,否则为ret)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minCostII(vector<vector<int>>& costs) {
int n = costs.size();
int m = n ? costs[0].size() : 0;
int ret = INT_MAX;
for (int i = 1; i < n; i++) {
int req = INT_MAX;
vector<int> lmins(m);
vector<int> rmins(m);
lmins[0] = costs[i - 1][0];
rmins[m - 1] = costs[i - 1][m - 1];
for (int j = 1; j < m; j++) {
lmins[j] = min(costs[i - 1][j], lmins[j - 1]);
}
for (int j = m - 2; j >= 0; j--) {
rmins[j] = min(costs[i - 1][j], rmins[j + 1]);
}
for (int j = 0; j < m; j++) {
int left = j - 1 >= 0 ? lmins[j - 1] : INT_MAX;
int right = j + 1 < m ? rmins[j + 1] : INT_MAX;
costs[i][j] += min(left, right);
}
}
for (int i = 0; i < m; i++) {
ret = min(ret, costs[n - 1][i]);
}
return ret == INT_MAX ? 0 : ret;
}
};
main(){
Solution ob;
vector<vector<int>> v = {{1,5,3},{2,9,4}};
cout <<(ob.minCostII(v));
}{{1,5,3},{2,9,4}}输出结果
5