题目链接
思路
- 设dp[i][j]是第i个房子刷第j个颜色时总共需要花费的价格,那么自然有 dp[i][j] = min{dp[i-1][(j+1)%3],dp[i-1][(j+2)%3]} + cost[i]
- 也就是说 dp[i][j]应该为前一个房子染另外两个颜色的最小值加上这个房子染颜色j的花费
class Solution {
public int minCost(int[][] costs) {
int[][] dp = new int[2][3];
System.arraycopy(costs[0], 0, dp[0], 0, 3);
for (int i = 1; i < costs.length; i++) {
for (int j = 0; j < 3; j++) {
dp[i % 2][j] = Math.min(dp[(i - 1) % 2][(j + 1) % 3], dp[(i - 1) % 2][(j + 2) % 3]) + costs[i][j];
}
}
int index = (costs.length - 1) % 2;
return Math.min(Math.min(dp[index][0], dp[index][1]), dp[index][2]);
}
}