# Class definition for the solution to the problem
class Solution:
def maximumStrength(self, nums: List[int], k: int) -> int:
n = len(nums)
# Create prefix sum array
acc = [0]
for num in nums:
acc.append(acc[-1] + num)
# Initialize the DP array
dps = [0] * (n + 1)
# Iterate through possible number of subarrays
for ck in range(k):
# Calculate the weight for current number of subarrays
cw = k - ck
if ck & 1: cw = -cw
lastDps = dps[ck]
dps[ck] = curs = -inf
# Update DP values for the current subarray count
for i in range(ck, n - k + ck + 1):
t = lastDps - acc[i] * cw
if curs < t: curs = t
lastDps = dps[i + 1]
t = curs + acc[i + 1] * cw
dps[i + 1] = t if dps[i] < t else dps[i]
# Return the maximum strength from the last DP value
return dps[-1]