Medium
You are given two integer arrays prices
and strategy
, where:
prices[i]
is the price of a given stock on the ith
day.strategy[i]
represents a trading action on the ith
day, where:
-1
indicates buying one unit of the stock.0
indicates holding the stock.1
indicates selling one unit of the stock.You are also given an even integer k
, and may perform at most one modification to strategy
. A modification consists of:
k
consecutive elements in strategy
.k / 2
elements to 0
(hold).k / 2
elements to 1
(sell).The profit is defined as the sum of strategy[i] * prices[i]
across all days.
Return the maximum possible profit you can achieve.
Note: There are no constraints on budget or stock ownership, so all buy and sell operations are feasible regardless of past actions.
Example 1:
Input: prices = [4,2,8], strategy = [-1,0,1], k = 2
Output: 10
Explanation:
Modification | Strategy | Profit Calculation | Profit |
---|---|---|---|
Original | [-1, 0, 1] | (-1 × 4) + (0 × 2) + (1 × 8) = -4 + 0 + 8 | 4 |
Modify [0, 1] | [0, 1, 1] | (0 × 4) + (1 × 2) + (1 × 8) = 0 + 2 + 8 | 10 |
Modify [1, 2] | [-1, 0, 1] | (-1 × 4) + (0 × 2) + (1 × 8) = -4 + 0 + 8 | 4 |
Thus, the maximum possible profit is 10, which is achieved by modifying the subarray [0, 1]
.
Example 2:
Input: prices = [5,4,3], strategy = [1,1,0], k = 2
Output: 9
Explanation:
Modification | Strategy | Profit Calculation | Profit |
---|---|---|---|
Original | [1, 1, 0] | (1 × 5) + (1 × 4) + (0 × 3) = 5 + 4 + 0 | 9 |
Modify [0, 1] | [0, 1, 0] | (0 × 5) + (1 × 4) + (0 × 3) = 0 + 4 + 0 | 4 |
Modify [1, 2] | [1, 0, 1] | (1 × 5) + (0 × 4) + (1 × 3) = 5 + 0 + 3 | 8 |
Thus, the maximum possible profit is 9, which is achieved without any modification.
Constraints:
2 <= prices.length == strategy.length <= 105
1 <= prices[i] <= 105
-1 <= strategy[i] <= 1
2 <= k <= prices.length
k
is evenimport kotlin.math.max
class Solution {
fun maxProfit(p: IntArray, s: IntArray, k: Int): Long {
val n = p.size
val p1 = LongArray(n + 1)
val p2 = LongArray(n + 1)
for (i in 0..<n) {
p1[i + 1] = p1[i] + s[i].toLong() * p[i]
p2[i + 1] = p2[i] + p[i]
}
var max: Long = 0
for (i in 0..n - k) {
val m = i + k / 2
val e = i + k
val op = p1[e] - p1[i]
val np = p2[e] - p2[m]
max = max(max, np - op)
}
return p1[n] + max
}
}