There are a row of n houses, each house can be painted with one of the three colors: red, blue or green. 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 3 cost matrix. For example, costs[0][0] is the cost of painting house 0 with color red; costs[1][2] is the cost of painting house 1 with color green, and so on… Find the minimum cost to paint all houses.
Note:
All costs are positive integers.
Example:
Input: [[17,2,17],[16,16,5],[14,3,19]]
Output: 10
Explanation: Paint house 0 into blue, paint house 1 into green, paint house 2 into blue.
Minimum cost: 2 + 5 + 3 = 10.
解题思路:
一道很明显的动态规划的题目. 每个房子有三种染色方案, 那么如果当前房子染红色的话, 最小代价将是上一个房子的绿色和蓝色的最小代价+当前房子染红色的代价. 对另外两种颜色也是如此. 因此动态转移方程为:
Sub-problem: find the minimum cost to paint the houses up to current house in red, blue or green.
Function:
Red: min(f[i - 11][1], f[i - 1][2]) + costs[i][0].
Blue: min(f[i - 1][0], f[i - 1][2]) + costs[i][1].
Green: min(f[i - 1][0], f[i - 1][1]) + costs[i][2].
Initialization: f[0][i] = 0.
Answer: min(f[costs.length][i]).
Line 933: Char 34: runtime error: reference binding to misaligned address 0xbebebebebebebebe for type 'value_type', which requires 4 byte alignment (stl_vector.h)
0xbebebebebebebebe: note: pointer points here
<memory cannot be printed>
这个错误出现是因为costs[i]超出了边界
易错点
- dp比costs多出一维,应该使用
costs[i - 1]
否则会报上面的错误
code
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
int n = costs.size();
// 直接initialize成0更好
vector<vector<int>> dp(n + 1, vector<int>(3, INT_MAX));
for (int i = 0; i < 3; i ++)
dp[0][i] = 0;
for(int i = 1; i < n + 1; i++){
dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0];
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1];
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i - 1][2];
}
return min(dp[n][0], min(dp[n][1], dp[n][2]));
}
};