尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
动态规划优化:粉刷房子II算法详解
1. 问题背景与核心挑战粉刷房子 II这道算法题表面上是关于房屋粉刷的颜色选择问题实际上是一个经典的动态规划(DP)练习题。题目描述为有n栋房子排成一排每栋房子可以用k种不同颜色中的一种进行粉刷且相邻两栋房子不能粉刷相同的颜色。给定一个n×k的成本矩阵求粉刷所有房子的最小总成本。这道题之所以被广泛讨论是因为它完美展现了动态规划的两个关键特性最优子结构当前最优解依赖于子问题的最优解重叠子问题相同子问题会被多次计算2. 基础解法分析2.1 暴力递归思路最直观的解法是使用递归穷举所有可能的粉刷方案def minCost(costs): n len(costs) k len(costs[0]) if n 0 else 0 def dfs(house, prev_color): if house n: return 0 min_cost float(inf) for color in range(k): if color ! prev_color: cost costs[house][color] dfs(house 1, color) min_cost min(min_cost, cost) return min_cost return dfs(0, -1)这种解法的时间复杂度是O(k^n)显然无法处理稍大规模的问题。2.2 记忆化递归优化通过添加备忘录来避免重复计算def minCost(costs): n len(costs) k len(costs[0]) if n 0 else 0 memo {} def dfs(house, prev_color): if (house, prev_color) in memo: return memo[(house, prev_color)] if house n: return 0 min_cost float(inf) for color in range(k): if color ! prev_color: cost costs[house][color] dfs(house 1, color) min_cost min(min_cost, cost) memo[(house, prev_color)] min_cost return min_cost return dfs(0, -1)时间复杂度优化到O(nk^2)因为共有n×k个状态每个状态需要O(k)时间计算。3. 动态规划优化技巧3.1 标准DP解法将递归转为迭代式DPdef minCost(costs): if not costs or not costs[0]: return 0 n, k len(costs), len(costs[0]) dp [[0]*k for _ in range(n)] # 初始化第一栋房子 for color in range(k): dp[0][color] costs[0][color] for house in range(1, n): for color in range(k): # 找出前一栋房子非color颜色的最小成本 min_prev float(inf) for prev_color in range(k): if prev_color ! color: min_prev min(min_prev, dp[house-1][prev_color]) dp[house][color] costs[house][color] min_prev return min(dp[-1])这种解法时间复杂度O(nk^2)空间复杂度O(nk)。3.2 空间优化技巧观察到当前状态只依赖于前一栋房子的状态可以优化空间def minCost(costs): if not costs or not costs[0]: return 0 n, k len(costs), len(costs[0]) prev_dp costs[0].copy() for house in range(1, n): curr_dp [0]*k for color in range(k): min_prev float(inf) for prev_color in range(k): if prev_color ! color: min_prev min(min_prev, prev_dp[prev_color]) curr_dp[color] costs[house][color] min_prev prev_dp curr_dp return min(prev_dp)空间复杂度降为O(k)。4. 进阶优化O(nk)解法4.1 优化思路关键观察点在计算每个颜色时我们只需要知道前一栋房子的最小成本和次小成本如果当前颜色不等于前一栋房子的最小成本对应的颜色直接使用最小成本否则使用次小成本4.2 实现代码def minCost(costs): if not costs or not costs[0]: return 0 n, k len(costs), len(costs[0]) prev_min1 prev_min2 0 prev_color1 -1 for house in range(n): curr_min1 curr_min2 float(inf) curr_color1 -1 for color in range(k): cost costs[house][color] if color prev_color1: cost prev_min2 else: cost prev_min1 if cost curr_min1: curr_min2 curr_min1 curr_min1 cost curr_color1 color elif cost curr_min2: curr_min2 cost prev_min1, prev_min2 curr_min1, curr_min2 prev_color1 curr_color1 return prev_min1这种解法将时间复杂度优化到O(nk)空间复杂度O(1)。5. 实际应用与变种5.1 实际应用场景这种DP优化技巧可以应用于资源分配问题如任务分配到不同机器路径规划问题如选择不同路线生产调度问题如选择不同生产线5.2 常见变种题目相邻房子颜色限制更复杂如前两栋不能同色成本计算方式变化如考虑颜色过渡的额外成本环形排列的房子首尾也视为相邻6. 调试与验证技巧6.1 测试用例设计设计测试用例时应考虑test_cases [ ([], 0), # 空输入 ([[1]], 1), # 单栋房子 ([[1,2],[1,2]], 2), # 两栋房子 ([[1,5,3],[2,9,4]], 5), # 典型情况 ([[17,2,17],[16,16,5],[14,3,19]], 10) # 复杂情况 ]6.2 调试技巧打印DP表格中间状态对每个house记录选择的颜色路径使用小规模数据手动验证7. 性能对比实测在不同规模下的性能对比单位毫秒数据规模暴力递归记忆化递归标准DP优化DPn10,k510000.50.20.1n100,k10超时520.5n1000,k20超时500200108. 经验总结DP问题先想清楚状态定义和转移方程空间优化时注意状态依赖关系寻找问题中的特殊性质可以进一步优化对于极值类问题记录前几个极值往往能简化计算这种优化思路不仅适用于粉刷房子问题也可以推广到其他类似的DP问题中。关键在于发现状态转移中的冗余计算并通过预处理或记录关键信息来消除这些冗余。
RELATED

相关推荐

macOS 上 LibreOffice 设置中文界面的完整指南

macOS 上 LibreOffice 设置中文界面的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/11 14:09:18
SystemInformer 系统监控工具源码构建完整手册:4 步从克隆到可执行程序

SystemInformer 系统监控工具源码构建完整手册:4 步从克隆到可执行程序

SystemInformer 系统监控工具源码构建完整手册:4 步从克隆到可执行程序 【免费下载链接】systeminformer A free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminar…

📅 2026/9/11 14:04:17
GhostTrack 使用指南:如何快速追踪 IP 地址、手机号码与用户名

GhostTrack 使用指南:如何快速追踪 IP 地址、手机号码与用户名

GhostTrack 使用指南:如何快速追踪 IP 地址、手机号码与用户名 【免费下载链接】GhostTrack Useful tool to track location or mobile number 项目地址: https://gitcode.com/GitHub_Trending/gh/GhostTrack GhostTrack 是一款 Python 命令行 OSINT 工具&am…

📅 2026/9/11 14:04:17
MORE NEWS

更多资讯

📰

洁净车间环境监控系统设计与实践

1. 洁净车间环境监控的行业痛点在制药、电子制造、食品加工等行业,洁净车间的温湿度控制直接关系到产品质量和生产安全。传统的人工巡检方式存在三大致命缺陷:数据滞后性:每小时记录一次的手工台账无法捕捉突发性环境波动,等发现问…

📰

Windows全局文件搜索神器Everything:原理、配置与搜索技巧完全指南

电脑全局搜索Everything:丢掉“等它转圈”的日子,找回指尖即达的检索快感如果你每天都在Windows上找文件,一定经历过这种崩溃:明明知道文件名里有个关键词,但打开资源管理器右上角的搜索框,它转啊转&#x…

📰

CMSIS-6静态工程:嵌入式开发的编译期硬件建模革命

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

StaffML Vault 大规模构建 Runbook 实战:基于覆盖率分析与 Gemini 迭代生成的题库批量扩充管线

StaffML Vault 大规模构建 Runbook 实战:基于覆盖率分析与 Gemini 迭代生成的题库批量扩充管线 【免费下载链接】cs249r_book Machine Learning Systems 项目地址: https://gitcode.com/GitHub_Trending/cs/cs249r_book 导读 本指南完整讲解 cs249r / Staff…

📰

如何使用 supervisord 管理 Appsmith Docker 容器内的后端与 Caddy 进程

如何使用 supervisord 管理 Appsmith Docker 容器内的后端与 Caddy 进程 【免费下载链接】appsmith Platform to build admin panels, internal tools, and dashboards. Integrates with 25 databases and any API. 项目地址: https://gitcode.com/GitHub_Trending/ap/appsmi…

📰

PythonRobotics 动态窗口法(Dynamic Window Approach)实现解析:2D 移动机器人局部避障与轨迹规划实战

PythonRobotics 动态窗口法(Dynamic Window Approach)实现解析:2D 移动机器人局部避障与轨迹规划实战 【免费下载链接】PythonRobotics Python sample codes and textbook for robotics algorithms. 项目地址: https://gitcode.com/GitHub_…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬