LeetCode——剑指 Offer II 091. 粉刷房子
通过万岁!!!
-
题目:一共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; } }
-
总结:题目还可以,公式也比较简单,还是得做的多了,才能分析的更加透彻。这里也相当于再次总结了动态规划的解题步骤,也就是四要素(数组含义、初始化、输出、递推公式)。
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
js根据路径下载文件及自定义下载文件名称