Python 中的最大和数组分区
假设我们有一个整数数组 A,我们需要将其划分为长度最多为 K 的(连续的)子数组。分区后,每个子数组的值都会更改为该子数组的最大值。我们需要找到分区后给定数组的最大和。因此,如果输入类似于 [1, 15, 7, 9, 2, 5, 10] 且 k = 3,则输出将为 84。这是因为数组变为 [15, 15, 15, 9, 10, 10, 10]
为了解决这个问题,我们将遵循以下步骤:
- 创建一个与 A 长度相同的数组 dp,并将其全部填充为 0
- 对于 i 从 0 到 A 的长度 - 1
- 如果 i – 1 >= 0,则 dp[i] = A[i] + dp[i - 1],否则为 0
- temp := A[i]
- 对于 j 从 1 到 k – 1
- 如果 i – j >= 0
- index := i – j
- temp := temp 和 A[i - j] 的最大值
- 如果 index – 1 >= 0,则
- dp[i] := dp[i] 和 (temp*(i – index + 1) + dp[index - 1]) 的最大值
- 否则 dp[i] := dp[i] 和 0 的最大值
- 如果 i – j >= 0
- 返回 dp 的最后一个元素
让我们看看下面的实现来更好地理解:
示例
class Solution(object): def maxSumAfterPartitioning(self, A, K): dp = [0 for i in range(len(A))] for i in range(len(A)): dp[i] = A[i] + (dp[i-1] if i-1>=0 else 0) temp = A[i] for j in range(1,K): if i-j>=0: index = i-j temp = max(temp,A[i-j]) dp[i] = max(dp[i],temp*(i-index+1) + (dp[index-1] if index-1 >=0 else 0)) return dp[-1] ob = Solution() print(ob.maxSumAfterPartitioning([1,15,7,9,2,5,10],3))
输入
[1,15,7,9,2,5,10] 3
输出
84
广告