- Leetcode 3500. Minimum Cost to Divide Array Into Subarrays
- 1. 解题思路
- 2. 代码实现
- 题目链接:3500. Minimum Cost to Divide Array Into Subarrays
1. 解题思路
这一题非常惭愧,没有自己搞定,基本是抄的大佬们的代码,甚至抄完之后还是没完全理解,非常惭愧……
整体这一题的思路还是比较简单的,就是一个动态规划,剩下的问题就在于怎么写这个迭代式。
如果单纯按照题意,设置迭代方式为考察每一个位置作为第i
个子串的开头,并考察其子串的终点位置时,其对应的算法复杂度就成了
O
(
N
3
)
O(N^3)
O(N3),这显然太大了。
因此,我们就必须要调整我们的迭代方式,将其压缩到 O ( N 2 ) O(N^2) O(N2)左右才行。
大佬们的答案最终给出的迭代关系式为如下:
d
p
(
t
,
i
+
1
)
=
min
j
=
0
j
=
i
(
d
p
(
t
−
1
,
j
)
+
∑
α
=
0
i
n
α
⋅
∑
β
=
j
+
1
i
+
1
c
β
+
k
⋅
∑
γ
=
j
+
1
N
c
γ
)
dp(t, i+1) = \min\limits_{j=0}^{j=i} (dp(t-1, j) + \sum\limits_{\alpha=0}^{i}n_{\alpha} \cdot \sum\limits_{\beta=j+1}^{i+1}c_{\beta} + k \cdot \sum\limits_{\gamma=j+1}^{N}c_{\gamma})
dp(t,i+1)=j=0minj=i(dp(t−1,j)+α=0∑inα⋅β=j+1∑i+1cβ+k⋅γ=j+1∑Ncγ)
其中, d p ( t , i ) dp(t, i) dp(t,i)表示将前 i i i个数组拆分为至多 t t t个子序列,然后后续 i + 1 i+1 i+1到 n n n个元素作为剩下的子序列时其所需的最小cost。
2. 代码实现
我们将其翻译为最终的python代码语言为:
class Solution:
def minimumCost(self, nums: List[int], cost: List[int], k: int) -> int:
n = len(nums)
sn = list(accumulate(nums))
sc = list(accumulate(cost, initial=0))
dp = [math.inf for _ in range(n+1)]
dp[0] = 0
for i in range(n):
for j in range(i+1):
dp[i+1] = min(dp[i+1], dp[j] + sn[i] * (sc[i+1] - sc[j]) + k * (sc[n] - sc[j]))
return dp[n]
提交代码评测得到:耗时2777ms,占用内存18.1MB。