leetcode 刷题:256. 粉刷房子

leetcode 256. 粉刷房子

题目

假如有一排房子,共 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。

动态规划解法

第 n 排房子刷漆方案不仅受第 n-1 排房子颜色的影响,还受 0 到 n-1 排房子的总花费影响。

假设当前房子选择红色,那么上一间房子只能在绿色,蓝色里面选择,即上一间房子涂绿色或蓝色花费的钱取最小值,再加上当前选择红色需要花费的钱,就会等于当前房子选择红色,并且是花费最少的钱。

class Solution:
    def minCost(self, costs: List[List[int]]) -> int:
        if not costs:
            return 0
        for i in range(1, len(costs)):
            # 假设当前选择红色,那么上一间房子涂绿色或者蓝色里面选择最低的花费,并且加上当前房子涂红色需要的花费
            costs[i][0] = costs[i][0] + min(costs[i-1][1], costs[i-1][2])
            # 假设当前选择蓝色,那么上一间房子涂红色或者绿色里面选择最低的花费,并且加上当前房子涂蓝色需要的花费
            costs[i][1] = costs[i][1] + min(costs[i-1][0], costs[i-1][2])
            # 假设当前选择绿色,那么上一间房子涂红色或者蓝色里面选择最低的花费,并且加上当前房子涂绿色需要的花费
            costs[i][2] = costs[i][2] + min(costs[i-1][1], costs[i-1][0])
        return min(costs[-1])

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值