当前位置: 首页 > 知识库问答 >
问题:

我如何记忆这个重复关系?

左劲
2023-03-14
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);
    }
};

不幸的是,这是TLES。由于我使用startindex+1递归调用,所以我并不真的认为我遇到了重叠的子问题。

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

共有1个答案

邴俊友
2023-03-14

对于动态编程,我们只需定义一个包含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)内存。

  • 有关其他详细信息,请参阅讨论板。有大量被接受的解决方案,有各种语言和解释,有效的算法,以及渐近的时间/空间复杂度分析1,2在其中。
 类似资料:
  • 我想创建一个程序来模拟Unix服务器上的内存不足(OOM)情况。我创造了这个超级简单的记忆食客: 它消耗的内存与中定义的一样多,现在正好是50 问题是它是有效的。即使在具有1的系统上 当我检查top时,我看到这个过程消耗了50 系统规范:Linux内核3.16(Debian)很可能启用了Overmit(不知道如何检查),没有交换和虚拟化。

  • 问题内容: 我想创建一个程序来模拟Unix服务器上的内存不足(OOM)情况。我创建了这个超级简单的内存消耗者: 它消耗的内存与定义的内存一样多,而现在恰好是50 GB的RAM。它按1 MB分配内存,并精确打印无法分配更多内存的点,这样我就知道它设法吃了哪个最大值。 问题是它有效。即使在具有1 GB物理内存的系统上。 当我检查顶部时,我发现该进程占用了50 GB的虚拟内存,而占用的驻留内存不到1 M

  • 使用Java的工作代码: C++代码用dictionary[“Apple”,“Pen”]返回“ApplePenApple”的false,我不知道为什么java返回true是正确的。这两种解决方案之间唯一的主要区别(我认为)是我的C++在java代码中使用向量而不是原生数组。最初,我认为这可能与C++使用自动存储(堆栈)而不是自由存储(堆)有关,这就是为什么我使用向量而不是C样式的数组来避免内存管理

  • 写一个函数均衡器(w1,w2),它包含两个不同长度的单词w1和w2。函数应该返回重复的较小单词,直到它达到长单词的长度

  • 我需要将12小时的时间转换为24小时的格式。 我现在已经把12小时的时间硬编码了,以使事情更简单。 我的逻辑:输入sting 07:05:45PM提取最后2个字符。如果AM check为前两个字符,则为12。。如果是,则将其设置为00,否则按原样输出,如果PM检查前两位数字是否为12。。如果是,请保持原样,如果不是,则在前2位加上12 总线错误:10是我运行代码得到的

  • 用户: 而此错误显示为: