题目链接: http://www.lintcode.com/en/problem/paint-house-ii/
There are a row of n
houses, each house can be painted with one of the k
colors. The cost of painting each house with a certain color is different. You have to paint all the houses such that no two adjacent houses have the same color.
The cost of painting each house with a certain color is represented by a n
x k
cost matrix. For example, costs[0][0]
is the cost of painting house 0
with color 0
; costs[1][2]
is the cost of painting house 1
with color 2
, and so on... Find the minimum cost to paint all houses.
Given n
= 3, k
= 3, costs
= [[14,2,11],[11,14,5],[14,3,10]]
return10
house 0 is color 2, house 1 is color 3, house 2 is color 2,2 + 5 + 3 = 10
class Solution {
public:
/**
* @param costs n x k cost matrix
* @return an integer, the minimum cost to paint all houses
*/
int minCostII(vector<vector<int>>& costs) {
// Write your code here
int m=costs.size();
if(m==0) return 0;
int n=costs[0].size();
vector<vector<int>> dp(2,vector<int>(n));
int min1=INT_MAX,min2=INT_MAX;
for(int i=0;i<n;i++) {
dp[0][i]=costs[0][i];
if(dp[0][i]<min1) {
min2=min1;
min1=dp[0][i];
}
else if(dp[0][i]<min2) {
min2=dp[0][i];
}
}
for(int i=1;i<m;i++) {
for(int j=0;j<n;j++) {
dp[i%2][j]=((dp[(i-1)%2][j]==min1)?min2:min1)+costs[i][j];
}
min1=min2=INT_MAX; //别忘了更新min1,min2为INT_NAX,求新一行的最小值和第二小值
for(int j=0;j<n;j++) {
int t=dp[i%2][j];
if(t<min1) {
min2=min1;
min1=t;
}
else if(t<min2) {
min2=t;
}
}
}
return min1;
}
};