背包DP-6447. 给墙壁刷油漆
6447. 给墙壁刷油漆
Description
Difficulty: 困难
Related Topics:
给你两个长度为 n
下标从 0 开始的整数数组 cost
和 time
,分别表示给 n
堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠:
- 一位需要 付费 的油漆匠,刷第
i
堵墙需要花费time[i]
单位的时间,开销为cost[i]
单位的钱。 - 一位 免费 的油漆匠,刷 任意 一堵墙的时间为
1
单位,开销为0
。但是必须在付费油漆匠 工作 时,免费油漆匠才会工作。
请你返回刷完 n
堵墙最少开销为多少。
示例 1:
输入:cost = [1,2,3,2], time = [1,2,3,2]
输出:3
解释:下标为 0 和 1 的墙由付费油漆匠来刷,需要 3 单位时间。同时,免费油漆匠刷下标为 2 和 3 的墙,需要 2 单位时间,开销为 0 。总开销为 1 + 2 = 3 。
示例 2:
输入:cost = [2,3,4,2], time = [1,1,1,1]
输出:4
解释:下标为 0 和 3 的墙由付费油漆匠来刷,需要 2 单位时间。同时,免费油漆匠刷下标为 1 和 2 的墙,需要 2 单位时间,开销为 0 。总开销为 2 + 2 = 4 。
提示:
1 <= cost.length <= 500
cost.length == time.length
- 1 <= cost[i] <= 106
1 <= time[i] <= 500
Solution
主要考验状态定义和边界条件的处理。
Language: Python3
class Solution:
def paintWalls(self, cost: List[int], time: List[int]) -> int:
n = len(cost)
@cache
def dfs(i, j):
"""
dfs(i, j): 要刷完0~i面墙,当前剩余时间为j,最少开销是多少
"""
if j >= i + 1: return 0
if i < 0: return float("inf")
return min(dfs(i - 1, j + time[i]) + cost[i], dfs(i - 1, j - 1))
return dfs(n - 1, 0)