1. 问题背景与核心概念
粉刷房子问题是一个经典的动态规划应用场景。假设我们有n栋房子排成一排,每栋房子可以用k种不同颜色中的一种进行粉刷。相邻的两栋房子不能粉刷成相同的颜色,且每种颜色的粉刷成本不同。我们需要计算出粉刷所有房子的最低总成本。
这个问题的现实意义在于:装修公司经常需要为客户规划房屋粉刷方案,在满足美观要求(相邻房屋颜色不同)的前提下控制成本。动态规划正是解决这类具有重叠子问题和最优子结构特性的问题的利器。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题建模与状态定义
2.1 输入参数定义
假设我们有以下输入:
- n:房屋数量(n >= 1)
- k:颜色种类(k >= 1)
- costs:n×k的二维数组,costs[i][j]表示第i栋房子使用第j种颜色的成本
2.2 状态转移方程推导
定义dp[i][j]为粉刷前i栋房子,且第i栋房子使用第j种颜色时的最小总成本。状态转移方程为:
dp[i][j] = min(dp[i-1][m] for m in range(k) if m != j) + costs[i][j]
这个方程的含义是:当前房子的某种颜色方案的最小成本,等于前一个房子所有非该颜色方案的最小成本,加上当前房子使用该颜色的成本。
3. 算法实现与优化
3.1 基础实现方案
python复制def 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 j in range(k):
dp[0][j] = costs[0][j]
# 动态规划填表
for i in range(1, n):
for j in range(k):
# 找出前一个房子非j颜色的最小成本
min_prev = float('inf')
for m in range(k):
if m !
