You are given an array of integers nums with length n, and a positive
odd integer k.
Select exactly k disjoint subarrays sub 1, sub2, ..., subk from
nums such that the last element of subi appears before the first element of sub{i+1} for all 1 <= i <= k-1. The goal is to maximize their combined strength.
The strength of the selected subarrays is defined as:
Input: nums =[1,2,3,-1,2], k =3Output: 22Explanation:
The best possible way to select 3 subarrays is: nums[0..2], nums[3..3], and
nums[4..4]. The strength is calculated as follows:`strength = 3 * (1 + 2 + 3) - 2 * (-1) + 2 = 22`
Input: nums =[12,-2,-2,-2,-2], k =5Output: 64Explanation:
The only possible way to select 5 disjoint subarrays is: nums[0..0],nums[1..1], nums[2..2], nums[3..3], and nums[4..4]. The strength is calculated
as follows:`strength = 5 * 12 - 4 * (-2) + 3 * (-2) - 2 * (-2) + (-2) = 64`
The problem requires selecting exactly k disjoint subarrays with alternating signs in their contribution to the total strength. This is similar to a variant of the maximum subarray sum problem, but with alternating coefficients. We use dynamic programming to keep track of the best possible strength for each number of subarrays selected and each sign.
classSolution {
public:longlong maximumStrength(vector<int>& nums, int k) {
int n = nums.size();
vector<vector<longlong>> dp(k+1, vector<longlong>(n+1, LLONG_MIN));
for (int i =0; i <= n; ++i) dp[0][i] =0;
for (int t =1; t <= k; ++t) {
longlong cur = LLONG_MIN;
int sign = (k-t+1)%2?1:-1;
for (int i = t; i <= n; ++i) {
cur = max(cur, dp[t-1][i-1]);
dp[t][i] = max(dp[t][i-1] + sign*nums[i-1], cur + sign*nums[i-1]);
}
}
return*max_element(dp[k].begin(), dp[k].end());
}
};
classSolution {
publiclongmaximumStrength(int[] nums, int k) {
int n = nums.length;
long[][] dp =newlong[k+1][n+1];
for (int i = 0; i <= k; i++)
for (int j = 0; j <= n; j++)
dp[i][j]= Long.MIN_VALUE;
for (int i = 0; i <= n; i++) dp[0][i]= 0;
for (int t = 1; t <= k; t++) {
long cur = Long.MIN_VALUE;
int sign = ((k-t+1)%2 == 1) ? 1 : -1;
for (int i = t; i <= n; i++) {
cur = Math.max(cur, dp[t-1][i-1]);
dp[t][i]= Math.max(dp[t][i-1]+ sign*nums[i-1], cur + sign*nums[i-1]);
}
}
long ans = dp[k][0];
for (int i = 1; i <= n; i++) ans = Math.max(ans, dp[k][i]);
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution {
funmaximumStrength(nums: IntArray, k: Int): Long {
val n = nums.size
val dp = Array(k+1) { LongArray(n+1) { Long.MIN_VALUE } }
for (i in0..n) dp[0][i] = 0Lfor (t in1..k) {
var cur = Long.MIN_VALUE
val sign = if ((k-t+1)%2==1) 1Lelse -1Lfor (i in t..n) {
cur = maxOf(cur, dp[t-1][i-1])
dp[t][i] = maxOf(dp[t][i-1] + sign*nums[i-1], cur + sign*nums[i-1])
}
}
return dp[k].maxOrNull()!! }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution:
defmaximumStrength(self, nums: list[int], k: int) -> int:
n = len(nums)
dp = [[float('-inf')] * (n+1) for _ in range(k+1)]
for i in range(n+1):
dp[0][i] =0for t in range(1, k+1):
cur = float('-inf')
sign =1if (k-t+1)%2==1else-1for i in range(t, n+1):
cur = max(cur, dp[t-1][i-1])
dp[t][i] = max(dp[t][i-1] + sign*nums[i-1], cur + sign*nums[i-1])
return max(dp[k])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
impl Solution {
pubfnmaximum_strength(nums: Vec<i32>, k: i32) -> i64 {
let n = nums.len();
let k = k asusize;
letmut dp =vec![vec![i64::MIN; n+1]; k+1];
for i in0..=n { dp[0][i] =0; }
for t in1..=k {
let sign =if (k-t+1)%2==1 { 1 } else { -1 };
letmut cur =i64::MIN;
for i in t..=n {
cur = cur.max(dp[t-1][i-1]);
dp[t][i] = (dp[t][i-1] + sign*nums[i-1] asi64).max(cur + sign*nums[i-1] asi64);
}
}
*dp[k].iter().max().unwrap()
}
}