Я вычисляю Максимальная сумма подмассива с одним удалением на LeetCode:
Учитывая массив целых чисел, вернуть максимальную сумму для непустого подмассива (смежных элементов) с удалением не более одного элемента. Для ввода arr = [1,-2,0,3]
вывод должен быть 4
.
Я придумал рекурсивное решение, как показано ниже:
class Solution {
public:
int helper(vector<int>& n, vector<int>& cache, int startIndex) {
if(startIndex>=n.size()) return INT_MIN;
if(cache[startIndex]!=-1) return cache[startIndex];
int allInclusiveSum=0, sumWithOneDel=0, lowestVal=INT_MAX, maxVal=INT_MIN;
for(int i=startIndex; i<n.size(); i++) {
allInclusiveSum+=n[i];
maxVal=max(maxVal, allInclusiveSum);
if(i!=startIndex) {
lowestVal=min(lowestVal, n[i]);
sumWithOneDel=allInclusiveSum-lowestVal;
maxVal=max(maxVal, sumWithOneDel);
}
}
maxVal=max(maxVal, helper(n, cache, startIndex+1));
return cache[startIndex]=maxVal;
}
int maximumSum(vector<int>& arr) {
int i=0, first=arr[0];
for(i=1; i<arr.size(); i++)
if(arr[i]!=first) break;
if(i==arr.size()) return first;
vector<int> cache(arr.size(), -1);
return helper(arr, cache, 0);
}
};
К сожалению, этот файл TLE. Поскольку я вызываю рекурсивно с помощью startIndex+1
, я действительно не думаю, что сталкиваюсь с перекрывающимися подзадачами.
Есть ли способ запомнить свое решение? Если нет, то почему?