3
int solve(vector<int> &prefixSum, int n, int firstLen, int secondLen) {6
dp[n - secondLen] = prefixSum[n] - prefixSum[n - secondLen];8
for (int i = n - secondLen - 1; i >= 0; i--) {9
dp[i] = max(dp[i + 1], prefixSum[i + secondLen] - prefixSum[i]);12
dp[firstLen] = dp[firstLen] + prefixSum[firstLen] - prefixSum[0];14
for (int i = firstLen + 1; i <= n - secondLen; i++) {15
dp[i] = max(dp[i - 1], dp[i] + (prefixSum[i] - prefixSum[i - firstLen]));18
return *max_element(dp.begin(), dp.end());21
int maxSumTwoNoOverlap(vector<int> &nums, int firstLen, int secondLen) {23
vector<int> prefixSum(n + 1, 0);25
for (int i = 1; i <= n; i++) {26
prefixSum[i] = prefixSum[i - 1] + nums[i - 1];29
return max(solve(prefixSum, n, firstLen, secondLen), solve(prefixSum, n, secondLen, firstLen));