【问题标题】:How do I memoize this recurrence relation?我如何记住这种递归关系?
【发布时间】:2020-10-11 00:33:12
【问题描述】:

我正在解决 LeetCode 上的Maximum Subarray Sum with One Deletion

给定一个整数数组,返回最多删除一个元素的非空子数组(连续元素)的最大和。对于输入arr = [1,-2,0,3],输出应为4

我想出了一个递归解决方案如下:

类解决方案{
民众:
    int helper(vector& n, vector& 缓存, 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& arr) {
        int i=0, first=arr[0];
        for(i=1;i缓存(arr.size(),-1);
        返回助手(arr,缓存,0);
    }
};

不幸的是,这个 TLE。由于我使用startIndex+1 递归调用,我真的不认为我遇到了重叠的子问题。

有没有办法让我记住我的解决方案?如果不是,为什么?

【问题讨论】:

  • 嗯,26 次浏览和没有评论让我觉得我错过了一些东西/我的问题不正确。有人可以指出,以便我可以编辑它吗?谢谢!
  • 这是视图 27 ;-)。问题是,现在理解你的(或任何)算法对我来说需要太长时间,更不用说理解与另一个算法的细微差别了 ;-)。
  • 这里有大量的代码,并且没有真正的指导从哪里开始寻找问题。当我听到“memoize”时,我立即想到“为什么不使用std::map 来缓存?”但是我没有看到,所以...
  • @user3386109,所以我想我的错误是我使用了递归和迭代的组合,这就是我无法有效缓存它的原因。 (本质上只是蛮力)。谢谢,有帮助! :)
  • 我倾向于放弃这个。你总是可以自己回答:)

标签: c++ algorithm recursion dynamic-programming memoization


【解决方案1】:

使用动态编程,我们只需定义一个有 N 行和两列的 std::vector,然后一次性遍历我们的 arr,并使用 std::max 找到 max_sum

#include <vector>
#include <algorithm>


class Solution {
public:
    static inline int maximumSum(const std::vector<int> &arr) {
        int length = arr.size();
        std::vector<std::vector<int>> dynamic_sums(length, std::vector<int>(2, 0));
        dynamic_sums[0][0] = arr[0];
        int max_sum = arr[0];

        for (unsigned int row = 1; row < length; row++) {
            dynamic_sums[row][0] = std::max(arr[row], dynamic_sums[row - 1][0] + arr[row]);
            dynamic_sums[row][1] = std::max(arr[row], std::max(dynamic_sums[row - 1][1] + arr[row], dynamic_sums[row - 1][0]));
            max_sum = std::max(max_sum, std::max(dynamic_sums[row][0], dynamic_sums[row][1]));
        }

        return max_sum;
    }
};

同样是 O(N) 时间和 O(N) 内存。


参考文献

  • 有关其他详细信息,您可以查看Discussion Board。有很多公认的解决方案,有各种languages 和解释、高效的算法,以及渐近的time/space 复杂性分析1, 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多