leetcode 1031. Maximum Sum of Two Non-Overlapping Subarrays
题意:给你一个数组,再给你一个L,M,求在这个数组里面,两个不重合的长度分别为L,M的最的最大和。
思路:
先预处理一个dp[i][2];
dp[i][0]表示以i为开头,长度为L的值。
dp[i][1]表示以i为开头,长度为M的值。
在两层for,遍历i,j分别表示两个数组的头,只要两个数组不重合,就是合适的数组。
最后求个最大值就好了。
class Solution {
public:int maxSumTwoNoOverlap(vector<int>& A, int L, int M) {vector<int> sum(A.size(), 0);vector<vector<int>> dp(A.size(), vector<int>(2, 0));//sum[0] = A[0];//for (int i = 1; i<A.size(); i++)// sum[i] = sum[i - 1] + A[i];//for (int i = 0; i < A.size(); i++)// cout << sum[i] << '\t';//cout << endl;for (int i = 0; i<A.size(); i++){for (int j = 0; j < L && i+j<A.size(); j++)dp[i][0] += A[i + j];for (int j = 0; j < M && i+j<A.size(); j++)dp[i][1] += A[i + j];}//for (int i = 0; i < A.size(); i++)// cout << dp[i][0] << '\t';//cout << endl;//for (int i = 0; i < A.size(); i++)// cout << dp[i][1] << '\t';//cout << endl;int ans = 0;for (int i = 0; i<A.size(); i++){for (int j = 0; j<A.size(); j++){if (i<j && i+L <=j)ans = max(ans, dp[i][0] + dp[j][1]);if (i>j && j+M<=i)ans = max(ans, dp[i][0] + dp[j][1]);}}return ans;}
};