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

不含三个相关元素的递归最大子序列和

宋嘉禧
2023-03-14

我试图用递归的方法来解决一个最大化子序列和的方法,这样就没有三个元素是连续的。

有一种方法可以通过动态编程来实现这一点,但我想首先使用递归来构建它。

一些示例输入和输出:

Input:{1, 2, 3}
Output: 5

Input:{100, 1000, 100, 1000, 1}
Output: 2101

Input:{1, 2, 3, 4, 5, 6, 7, 8}
Output: 27
int maxSubsequenceSum(vector<int> nums)
{
    return helper(nums, nums.size());
}

int helper(vector<int>& nums, int index)
{
    if (index <= 0) return 0;

    int withoutThird = helper(nums, index - 3) + nums[index - 1] + nums[index - 2];
    int withoutSecond = helper(nums, index - 3) + (index - 1 < 0 ? 0 : nums[index - 1]) + (index - 3 < 0 ? 0 : nums[index - 3]);
    int withoutFirst = helper(nums, index - 3) + (index - 2 < 0 ? 0 : nums[index - 2]) + (index - 3 < 0 ? 0 : nums[index - 3]);
    return max(withoutThird, max(withoutSecond, withoutFirst));
}

单独地,withoutThird、withoutSecond和withoutFirst三个变量只在递归排列失败时给出正确的结果。为什么它会失败,这是正确的递归方法吗?

共有1个答案

燕寒
2023-03-14


问题是在没有三个连续元素的情况下获得最大值。

你要做的是,一次取3个元素,从中选择两个有最大和的元素,然后把它们相加,等等。

当你的递归从右到左。
假设{D,E,F}
(D+E)>E+F和(D+E)>(D+F)
您的代码将从最后3个元素中选择{D,E}。现在,假设{A,B,C}
假设(B+C)>(A+B)和(B+C)>(A+C)
您的代码将从前3个元素中选择{B,C}

 类似资料:
  • 给定一个列表{x_i},我想要找到从每个元素开始的最长的递增子序列,使得起始元素包含在子序列中。 最明显的方法是对每个元素执行通常的最长递增子序列算法,给出O(n^2logn)。这能打吗?

  • 例如: 给定为序列,和是要考虑的有效子序列,但不是,因为它包含连续的元素3和2。 如何找到一个最长的子序列,使它在中单调递减 我知道问题的版本包含单调的增加/减少。 但这里的附加条件让它变得困难。 有没有更好的办法?

  • LIS:最长递增子序列问题是寻找给定序列的子序列,其中子序列的元素按从低到高的顺序排序 例如: 0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15 此算法是否? 你能解释一下吗?

  • 所以我用动态编程做了一个简单的python代码来解决最大递增子序列的问题。问题如下: 给定一个数组 arr 的 N 个正整数。求出给定数组的最大和递增子序列的总和。 输入:输入的第一行包含一个整数 T,表示测试用例的数量。每个测试用例的第一行是 N(数组的大小)。每个测试用例的第二行包含数组元素。 输出:对于每个测试用例,在新行中打印所需的答案。 在我的解决方案中,我正在计算一个名为“总和”的列表

  • 假设我们有一些不相交的递减序列: 我选择一些递减序列(例如按顺序,,,,的5个递减序列)并将它们级联(结果序列。 现在我想求S中最长递增子序列的长度,在上面的示例中:-> 预期时间复杂度小于O(S)。

  • 问题内容: 我将以说这是家庭作业为开头。我只是在寻找一些指示。我一直在为此绞尽脑汁,对于我的一生,我只是不明白。我们被要求在列表中找到最小的元素。我知道我在这里需要一个子列表,但是在那之后我不确定。任何指针都很棒。谢谢。 问题答案: 从最一般的意义上讲,递归是一个基于分解工作的概念,然后将较小的工作分派给自己的副本。为了使递归正常工作,您需要三件事: 工作细目。您如何使每个步骤变得“简单”? 递归