如何利用fenwick树求数组中一个非递减子序列的最大和?例如,我们有1 4 4 2 2 3 3 1,这里一个非递减子序列的最大和是11(1 2 2 3 3)。
可以使用动态规划算法找到最大和。扫描数组,对于每个元素,将其值添加到有效的最大子序列和(子序列以不大于该元素的值结束)。
高效的实现需要某种方法在给定的子范围内快速找到最大值。可以使用扩充的二叉搜索树来实现。Fenwick树正是扩充二叉搜索树的一种高效实现。Fenwick树最常见的用途是在某个子范围中找到一个值的和。简单的修改允许使用它来查找子范围最大值(这是有效的,因为在这个特定的情况下,Fenwick树中的值从不减少)。
有关详细信息,请参阅这段Python代码:
array = [1, 4, 4, 2, 2, 3, 3, 1]
numbers = sorted(set(array))
n = len(numbers)
indexes = {numbers[v]:v+1 for v in range(0, n)}
n += 1
bit = [0] * n
result = 0
for x in array:
pos = indexes[x]
i = pos
maximum = 0
while i != 0:
maximum = max(maximum, bit[i])
i = i & (i-1)
x += maximum
i = pos
while i < n:
bit[i] = max(bit[i], x)
i += i & -i
result = max(result, x)
print(result)
时间复杂度为O(N log N)。空间复杂度为O(N)。
我已经设计了一个解决方案,可以使用一些测试用例,但是,对于许多我正在使用的算法是不正确的。 而不是寻求一个解决方案,我只是要求解释子序列是如何创建的,然后我将自己实现一个解决方案。 例如,输入: 6 6 问题陈述 在Quora上,我们有跟踪我们每天获得的支持投票数的聚合图。 当我们在特定大小的窗口上查看模式时,我们考虑了尽可能有效地跟踪趋势的方法,例如非递减和非递增子范围。 天数窗口定义为连续天数
假设我们有一些不相交的递减序列: 我选择一些递减序列(例如按顺序,,,,的5个递减序列)并将它们级联(结果序列。 现在我想求S中最长递增子序列的长度,在上面的示例中:-> 预期时间复杂度小于O(S)。
LIS:最长递增子序列问题是寻找给定序列的子序列,其中子序列的元素按从低到高的顺序排序 例如: 0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15 此算法是否? 你能解释一下吗?
所以我用动态编程做了一个简单的python代码来解决最大递增子序列的问题。问题如下: 给定一个数组 arr 的 N 个正整数。求出给定数组的最大和递增子序列的总和。 输入:输入的第一行包含一个整数 T,表示测试用例的数量。每个测试用例的第一行是 N(数组的大小)。每个测试用例的第二行包含数组元素。 输出:对于每个测试用例,在新行中打印所需的答案。 在我的解决方案中,我正在计算一个名为“总和”的列表
如果我从根节点开始,使用一个我要遍历的子节点列表,{“有机体”、“灵长类”、“人类”、“男性”、“John Smith”},然后递归处理一个步骤,并将剩余的子列表传递给子节点,返回这个。subnodes[MyList[0]].getSubnode(MyList.getRange(1,MyList.Count-1))...即使list.getRange()是一个浅层副本,它仍然会为每一级递归创建一个