「图解大厂面试高频算法题」动态规划-粉刷房子I

本文解析了大厂面试中常见的动态规划问题——粉刷房子I,通过寻找子问题、确定状态转移方程,详细介绍了如何解决这个问题。采用一维动态规划实现,分析了时间复杂度和空间复杂度,并提出了空间优化策略。
摘要由CSDN通过智能技术生成

「图解大厂面试高频算法题」动态规划-粉刷房子I

PS: 本文为「图解大厂面试高频算法题」专题,主旨是根据“二八法则”的原理,以付出20%的时间成本,获得80%的刷题的收益,让那些想进互联网大厂的人少走些弯路。

PS: 欢迎关注我获取更多大厂面试总结。

原题链接: https://leetcode-cn.com/problems/paint-house/

题目介绍

在这里插入图片描述

题目解答

又又又又是动态规划,动态规划的要点是啥来着?发现子问题、找出状态转换方程、优化数组空间。

首先寻找子问题

在这里插入图片描述
题目的原问题是求解粉刷从第0到第N个房子红/蓝/绿这三种颜色所花费的最低开销,这个问题可以拆成如下N个子问题

  • 粉刷第0个房子红/蓝/绿这三种颜色所花费的最低开销
  • 粉刷从第0到第1个房子红/蓝/绿这三种颜色所花费的最低开销
  • … …
  • 粉刷从第0到第N-1个房子红/蓝/绿这三种颜色所花费的最低开销
  • 粉刷从第0到第N个房子红/蓝/绿这三种颜色所花费的最低开销
    在这里插入图片描述
    注意这题有一个限制就是相邻的两个房子颜色不能相同,所以小粉刷匠每刷一个房子的时候,他需要思考这个房子要刷哪种颜色,刷红色?刷蓝色?刷绿色?这样每一个子问题又可以继续拆解变成如下3N个子问题
    在这里插入图片描述
  • 粉刷第0个房子红/蓝/绿这三种颜色所花费的最低开销
    • 给第0个房子刷红色时,粉刷从第0到第0个房子的最低开销是多少?
    • 给第0个房子刷蓝色时,粉刷从第0到第0个房子的最低开销是多少?
    • 给第0个房子刷绿色时,粉刷从第0到第0个房子的最低开销是多少?
  • 粉刷从第0到第1个房子红/蓝/绿这三种颜色所花费的最低开销
    • 给第1个房子刷红色时,粉刷从第0到第1个房子的最低开销是多少?
    • 给第1个房子刷蓝色时,粉刷从第0到第1个房子的最低开销是多少?
    • 给第1个房子刷绿色时,粉刷从第0到第1个房子的最低开销是多少?
  • … …
  • 粉刷从第0到第N-1个房子红/蓝/绿这三种颜色所花费的最低开销
    • 给第N-1个房子刷红色时,粉刷从第0到第N-1个房子的最低开销是多少?
    • 给第N-1个房子刷蓝色时,粉刷从第0到第N-1个房子的最低开销是多少?
    • 给第N-1个房子刷绿色时,粉刷从第0到第N-1个房子的最低开销是多少?
  • 粉刷从第0到第N个房子红/蓝/绿这三种颜色所花费的最低开销
    • 给第N个房子刷红色时,粉刷从第0到第N个房子的最低开销是多少?
    • 给第N个房子刷蓝色时,粉刷从第0到第N个房子的最低开销是多少?
    • 给第N个房子刷绿色时,粉刷从第0到第N个房子的最低开销是多少?
      在这里插入图片描述

确定状态转移方程

子问题已经确定出来了,那么如果我们知道了粉刷从第0到第N-1个房子红/蓝/绿这三种颜色所花费的最低开销,那么我们如何根据这个子问题来算出原问题粉刷从第0到第N个房子红/蓝/绿这三种颜色所花费的最低开销呢?

粉刷匠为了让开销达到最小,自学了编程然后搞了3个数组red、blue和green,red[k]表示粉刷从第0到第k个房子红/蓝/绿这三种颜色所花费的最低开销,其中第k个房子粉刷为红色,blue[k]和green[k]亦然,粉刷匠每到达一个房子的时候,都会去更新red[k]、blue[k]和green[k],当粉刷匠来到了第K个房子的时心里可能这么想:

  • 我要把第K个房子刷为红色
    • 粉刷匠决定把第K个房子刷为红色,并记录下当前第K个房子刷为红色时所花费的最低开销为red[k] = min(blue[k-1], green[k-1]) + cost[k]。
    • 解释: 既然粉刷匠想把第K个房子刷为红色,且想保持所花费的开销是最低的,那第K-1一个房子不能是红色的且要选择blue[k-1]和green[k-1]这两个数其中最小的一个。
  • 我要把第K个房子刷为蓝色
    • 同上
  • 我要把第K个房子刷为蓝色
    • 同上
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知春路金刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值