leetcode256. 粉刷房子

举报
兔老大 发表于 2021/04/27 23:50:33 2021/04/27
【摘要】 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的矩阵来表示的。 例如,costs[0][0] 表示第 0 号房子粉刷成红色...

假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。

当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的矩阵来表示的。

例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。请你计算出粉刷完所有房子最少的花费成本。

注意:

所有花费均为正整数。

示例:

输入: [[17,2,17],[16,16,5],[14,3,19]]
输出: 10
解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。
     最少花费: 2 + 5 + 3 = 10。

思路:dp[i][0,1,2]分别代表第i个格子必须用红、蓝、绿刷的最优解。则dp[i][0]的前一个格子可以是蓝或绿,也就是dp[i-1][1和dp[i-1][2]两种情况,取最优解加上cost[i][0]即可。另两种类似。

dp[i]只和dp[i-1]有关,所以用几个变量记录即可。


  
  1. class Solution {
  2. public int minCost(int[][] costs) {
  3. if(costs == null || costs.length == 0) return 0;
  4. int r_cost = costs[0][0];
  5. int b_cost = costs[0][1];
  6. int g_cost = costs[0][2];
  7. for(int i = 1; i < costs.length; i++){
  8. int r_tmp = r_cost;
  9. int b_tmp = b_cost;
  10. int g_tmp = g_cost;
  11. r_cost = costs[i][0] + Math.min(b_tmp, g_tmp);
  12. b_cost = costs[i][1] + Math.min(r_tmp, g_tmp);
  13. g_cost = costs[i][2] + Math.min(r_tmp, b_tmp);
  14. }
  15. return Math.min(Math.min(r_cost, b_cost),g_cost);
  16. }
  17. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104309849

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。