算法第七天-粉刷房子Ⅲ

粉刷房子Ⅲ

题目要求

解题思路

来自[宫水三叶]

动态规划

定义 f[i][j][k] 为开了前i间房子,且第 i 间房子的颜色编号为 j, 前 i 间房子形成的分区数量为 k 的所有方案中的[最小上色成本]。
我们不失一般性的考虑 f[i][j][k] 该如何转移,由于某些房子本身就已经上色了,上色的房子是不允许被粉刷的。
我们可以根据第 i 间房子是否已经被上色,进行分类情况讨论:

  • 第i间房子已经被上色,即houses[i] != 0,此时只有满足 j==houses[i] 的状态才是有意义的,其余状态均为INF
    同时根据[第i间房子的颜色j] 与 [第 i-1间房子的颜色p]是否相同,会决定第 i 间房子是否形成一个新的分区。这同样需要进行分情况讨论。
    整理后的状态转移方程为:
    f [ i ] [ j ] [ k ] = { m i n ( f [ i − 1 ] [ j ] [ k ] , f [ i − 1 ] [ p ] [ k − 1 ] ) j = = h o u s e [ i ] , p ! = j I N F j ! = h o u s e [ i ] \begin{equation} f[i][j][k]=\left\{ \begin{array}{l} min(f[i-1][j][k],f[i-1][p][k-1])& j == house[i],p!=j \\ INF & j!= house[i] \\ \end{array} \right. \end{equation} f[i][j][k]={min(f[i1][j][k],f[i1][p][k1])INFj==house[i],p!=jj!=house[i]
  • 第i间房子尚未被上色,即houses[i] == 0,此时房子可以被粉刷成任意颜色。不会有无效状态的情况。
    同样,根据[第i间房子的颜色j] 与 [第 i-1 间房子的颜色p]是否相同,会决定第i间房子是否形成一个新的分区。
    转移方程为:
    f [ i ] [ j ] [ k ] = m i n ( f [ i − 1 ] [ j ] [ k ] , f [ i − 1 ] [ p ] [ k − 1 ] ) + c o s t [ i ] [ j − 1 ] , p ! = j f[i][j][k] = min(f[i-1][j][k],f[i-1][p][k-1]) + cost[i][j-1] ,p!=j f[i][j][k]=min(f[i1][j][k],f[i1][p][k1])+cost[i][j1],p!=j
    一些编码细节:
  • 下标转换:这是个人习惯,无论做什么题,都可以将下标转换成从1开始,目的是为了[节省负值下标的分情况讨论]、[将无效状态限制在0下标内]或者 [充当哨兵]
  • 0x3f3f3f3f 作为INF:因为目标是求最小值,我们应当使用一个较大值充当正无穷,来关联无效状态。同时为了确保不会出现[在正无穷基础上累加导致丢失正无穷含义]的歧义情况,我们可以使用有[累加空间]的值作为[正无穷]

代码

class Solution:def minCost(self, houses: List[int], cost: List[List[int]], m: int, n: int, target: int) -> int:@functools.lru_cache(None)def dfs(i, j, blocks) :ret = 2147483647if blocks<=0 : return retif i==0 : return ret if blocks>1 else 0if houses[i-1]==0 :for k in range(1, n+1) :ret = min(ret, dfs(i-1, k, blocks-int(j!=k))+cost[i-1][k-1])return retret = min(ret, dfs(i-1, houses[i-1], blocks-int(j!=houses[i-1])))return retans = 2147483647if houses[-1]==0 :for k in range(1, n+1) :ans = min(ans, dfs(m-1, k, target)+cost[m-1][k-1])else :ans = min(ans, dfs(m-1, houses[-1], target))return -1 if ans==2147483647 else ans

复杂度分析

时间复杂度:一共有 m ∗ n ∗ t m* n* t mnt个状态需要被转移,每次转移需要枚举[所依赖的状态]的颜色,复杂度为 O ( n ) O(n) O(n)。整体复杂度为 O ( m ∗ n 2 ∗ t ) O(m * n^2 * t) O(mn2t)
空间复杂度: O ( m ∗ n ∗ t ) O(m * n * t) O(mnt)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel使用

前言&#xff1a; 所有的准备工作都做好了&#xff0c;就可以进入到Sentinel的具体使用上了&#xff0c;这里还需要一个测试工具叫做jmeter&#xff0c;是一个很好的测试工具&#xff0c;专门针对并发的&#xff0c;准备好以后&#xff0c;就可以直接开干了。 一、Sentinel作用…

闲人闲谈PS之五十一——项目物料移动中的2个WBS

惯例闲话&#xff1a;2024年在不知不自觉中已经到来&#xff0c;之前闲人也聊起过2023年是忙碌和收获的一年。今年的任务初步排一下&#xff0c;也基本上排到年底去了&#xff0c;又会是忙碌的一年。虽然忙碌&#xff0c;但是今年对于自己而言&#xff0c;有更加重要的事情要去…

vue3顶部内容固定定位,下面内容可以向上滚动

功能要求&#xff1a;一个div里有两个模块儿&#xff0c;顶部按钮模块儿和下面的内容区域模块儿&#xff0c;顶部按钮模块儿固定在顶部不随滚动条滚动&#xff0c;下面内容区域可以滚动 如图&#xff1a; 思路是&#xff1a; 1、顶部按钮固定定位&#xff0c;会脱离文档流&…

两阶段提交协议三阶段提交协议

两阶段提交协议 分布式事务是指会涉及到操作多个数据库的事务,在分布式系统中&#xff0c;各个节点之间在物理上相互独立&#xff0c;通过网络进行沟通和协调。 XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范&#xff08;即接口函数&#xff09;&#xff0c;交易…

sublime text 打开 txt 文档乱码问题

对于 windows 系统使用系统自带的 txt 编辑工具&#xff0c;默认打开和保存文件的文件的格式是 GBK 或者 GB2312&#xff0c;而 sublime 默认仅支持 utf-8&#xff0c;所以当从 windows 系统拷贝文件在 mac 上浏览有时候会出现乱码的问题&#xff0c;这时候就需要安装插件使 su…

python统计分析——直方图(plt.hist)

使用matplotlib.pyplot.hist()函数绘制直方图 from matplotlib.pyplot as pltdata_setnp.array([2,3,3,4,4,4,4,5,5,6]) plt.hist(fish_data) 下面介绍plt.hist()函数中常用的几个重要参数&#xff08;参数等号后为默认设置&#xff09;&#xff1a; &#xff08;1&#xff0…

Linux基础——进程初识(二)

1. 对当前目录创建文件的理解 我们知道在创建一个文件时&#xff0c;它会被默认创建到当前目录下&#xff0c;那么它是如何知道当前目录的呢&#xff1f; 对于下面这样一段代码 #include <stdio.h> #include <unistd.h>int main() {fopen("tmp.txt", …

Web 自动化测试过程中会遇到哪些问题?

作者&#xff1a;木可 链接&#xff1a;https://www.zhihu.com/question/636965892/answer/3341410674 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 Web自动化是指使用测试脚本来自动执行网页上的任务。这包括填…

螺丝厂家:家具螺丝的类型和规格

作为家具厂采购经理&#xff0c;您是否经常对如何选择合适的家具螺钉困惑不已&#xff1f;您想了解不同种类和型号家具螺钉特征和适用场景吗&#xff1f;你想找专业指南来帮助你提升产品质量和稳定性吗&#xff1f;假如你有这些困惑&#xff0c;那么就来对地方了&#xff01; 在…

Python遍历读取 A 文件夹中的 A1、A2、A3、A4、A5 中的各子文件夹中的图片,并对每张图片处理后保存到指定路径

目录 一、具体步骤二、文件夹目录结构样例三、代码四、实例遍历处理后结果五、总结 一、具体步骤 首先&#xff0c;指定 A 文件夹的路径和重命名后的文件夹路径。 然后&#xff0c;遍历 A 文件夹中的各子文件夹。 在每个子文件夹中&#xff0c;遍历所有文件。 读取每个文件&am…

使用 Swagger 导入 Postman: 最佳实践与步骤解析

Swagger和 Postman 都是常用的 API 测试工具&#xff0c;都有各自的优势。为了结合两者的优点&#xff0c;我们可以考虑将 Swagger 中的 API 定义导入到 Postman 中去&#xff0c;这样就可以利用 Postman 更强大的测试功能来测试 Swagger 定义的接口。 下面将以 Swagger Petst…

知虾会员**成为知虾会员,尊享专属权益**

在当今繁忙的生活中&#xff0c;线上购物已经成为现代人们的主要消费方式之一。而作为线上购物平台的领军者之一&#xff0c;Shopee为了提供更加个性化和便利的购物体验&#xff0c;推出了知虾会员&#xff08;Shopee会员&#xff09;服务。知虾会员不仅可以享受到一系列会员专…

LeetCoed刷题:21. 合并两个有序链表

题目&#xff1a; 是否独立解出&#xff1a;否 解题时的思路与想法&#xff1a;解题时有几个问题&#xff1a; 1.怎么遍历两个数组&#xff0c;嵌套两个while循环不能实现&#xff08;后面通过看题解知道list1&#xff01;null&&list2&#xff01;null&#xff09; …

修改 docker /dev/shm 的大小

修改 docker /dev/shm 的大小 1&#xff0c;获取完整id&#xff1a; docker inspect 245| grep Id rootlynxi:~# docker inspect 245| grep Id"Id": "245ab167ed9a79873b31b3a38df2053870fe72f267c3c1a660df25c63e37e88b",2&#xff0c;修改 ShmSize&…

函数模板和类模板(初阶)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX&#x1f43c;个人WeChat&#xff1a;ILXOXVJE&#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&am…

【springboot配置文件加载源码分析】

在Spring Boot的源码中&#xff0c;配置文件的加载是在应用程序启动的早期阶段进行的。具体来说&#xff0c;配置文件加载的主要步骤发生在SpringApplication类的run()方法中的prepareEnvironment方法中&#xff0c;真正读取我们的配置文件还是PropertySourceLoader。 本篇博客…

哪个牌子最值得购买?好用的洗地机排行榜

随着生活水平的提高&#xff0c;人们对家庭卫生的重视程度也越来越高&#xff0c;家用洗地机成为了现代家庭清洁中不可或缺的一部分。2024年的品牌排行榜也开始逐渐浮出水面&#xff0c;消费者们对于哪个品牌的家用洗地机更值得信赖也开始产生了新的讨论。接下来&#xff0c;让…

跟我用路由器学Linux编程实例四

专栏目录 第一章 简单编程实现花生壳的ddns功能 第二章 让花生壳ddns脚本自动工作 第三章 同时解析多个花生壳域名的脚本 第四章 具有通用性的花生壳ddns脚本 用折腾路由的兴趣&#xff0c;顺便入门shell编程。 第四章 具有通用性的花生壳ddns脚本 文章目录 专栏目录第四章 具…

C语言快速入门——基础知识

C语言基础 C语言基础C程序基本格式基本数据类型原码、反码和补码原码反码补码 整数类型浮点类型字符类型 变量变量的使用无符号数类型转换 运算符基本运算符运算符优先级自增自减运算符位运算符逻辑运算符 流程控制分支语句 - if分支语句 - switch循环语句 - for循环语句 - whi…

Ebean:一款被低估的ORM框架

ORM框架为什么不香&#xff1f; 对ORM框架的偏见 看了一些MyBaties与Hibernate进行对比的文章。可能是因为一些Hibernate历史原因&#xff0c;国内对于Hibernate普遍存在偏见&#xff0c;我摘抄了几点&#xff1a; 1. hibernate是全自动&#xff0c;而mybatis是半自动 hibernat…