通过万岁!!!
- 题目:一共n个房子,然后让你给房子粉刷颜色,要求相邻的房子的颜色不能一样。并且每个房子的每种颜色都有不同的价格。一共有三种颜色。
- 思路:这个题可以看到,是动态规划的问题。虽然动态规划的题目相对麻烦一点,但是已经做了好多个了,基本也熟悉了。首先是如何判断是动态规划问题,就是我们从1到n,我们可以在任何位置停止,都是一个子问题。这时候基本可以往动态规划上考虑了。然后就是动态规划的公式,我们在第i个房子的时候,假设弄成颜色1,则需要将前面房子(i-1)的颜色2或者3时成本的最小值,加上当前房子颜色1的成本。然后再考虑当前房子(第i个)弄成颜色2和颜色3的时候。然后最后返回第n个房子三种颜色的对应的成本的最小值。
- dp数组:i表示第几个房子,j表示第几种颜色,其存储的值表示,这时候的成本。
- 初始化:第一个房子每种颜色的成本即可。
- 最后输出:dp数组第n行,三种颜色的花费的最小值。
- 递推公式:第一种颜色:dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i][0],然后还有两种颜色,也是类似。
- 技巧:动态规划。
java代码
class Solution {
public int minCost(int[][] costs) {
int n = costs.length;
int[][] dp = new int[n][3];
dp[0][0] = costs[0][0];
dp[0][1] = costs[0][1];
dp[0][2] = costs[0][2];
for (int i = 1; i < n; i++) {
// 选择红色
dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + costs[i][0];
// 选择蓝色
dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + costs[i][1];
// 选择绿色
dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + costs[i][2];
}
int ans = Math.min(dp[n - 1][0], dp[n - 1][1]);
ans = Math.min(ans, dp[n - 1][2]);
return ans;
}
}
- 总结:题目还可以,公式也比较简单,还是得做的多了,才能分析的更加透彻。这里也相当于再次总结了动态规划的解题步骤,也就是四要素(数组含义、初始化、输出、递推公式)。