c++ - 使用 DP 的非相邻元素的最大数组和

标签 c++ bottom-up

这是 DP 的一个普遍问题。我必须在仅由非相邻元素组成的数组中找到最大总和。我看到了其他帖子,但我想使用动态编程来做到这一点,特别是自下而上的 DP。这是我的代码:

int maxSubsetSum(vector<int> arr,int start,int end) {
    int sum[arr.size()]; //to store max sum upto a given index
    sum[0] = arr[start];
    sum[1] = max(arr[start], arr[end]);
    if(start==end){
      return sum[0];
    }
    else if(start==end-1){
      return sum[1];
    }
    else{
        for(int i=2;i<=end;i++){
            sum[i]=max(arr[i],max(arr[i]+sum[i-2],sum[i-1]));
        }
    }
    return sum[end];
}

我在通过测试用例时遇到了错误。尽管当我手动运行一个测试用例时它运行正常。实际输出与我获得的相同。但是测试系统为我的代码提供了不同的输出。

我在测试用例上手动测试了这段代码:3 5 -7 8 10 并且答案与实际输出匹配 (=15) 但测试用例未通过。

sum[0]=3
sum[1]=5
sum[2]=max(-7,max(-7+3,5))=5
sum[3]=max(8,max(8+5,5))=13
sum[4]=max(10,max(10+5,13))=15

请指出我做错的正确方向。

最佳答案

试试这个:

int maxSubsetSum(vector<int> arr) {
    if (arr.size() == 1) {
      return arr[0];
    }
    if (arr.size() == 2) {
      return max(arr[0], arr[1]);
    }
    int sum[arr.size()]; //to store max sum upto a given index
    sum[0] = arr[0];
    sum[1] = max(arr[0], arr[1]);
    for(int i = 2; i < arr.size(); i++) {
        sum[i] = max(arr[i], max(arr[i] + sum[i - 2], sum[i - 1]));
    }
    return sum[arr.size() - 1];
}

关于c++ - 使用 DP 的非相邻元素的最大数组和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56555550/

相关文章:

c++ - 从字符串中删除字符

c++ - 有没有办法轻松处理返回 std::pairs 的函数?

python-3.x - 该算法(解决 leetcode 问题 650)的时间复杂度是多少?

c++ - Coin Change 自底向上动态规划

c++ - 如何让控制台文本刷新而不是重新输入?

python - 清理时使用 Boost Python 的段错误

将 std::string 转换为 std::wstring 的 C++ 问题 - Windows 与 Linux

c++ - 自下而上的方法来找零硬币的最小数量

python - 使用 Python 自下而上归并排序