Algorithm 求给定数组所有子区间的最大可能差之和

Algorithm 求给定数组所有子区间的最大可能差之和,algorithm,Algorithm,我在设计算法时遇到了一个问题。问题是这应该在O(n)时间内执行 以下是作业: 存在一个包含n个数字的未排序数组“a” mij=min{ai, ai+1, ..., aj}, Mij=max{ai, ai+1, ..., aj} 计算: S=SUM[i=1,n] { SUM[j=i,n] { (Mij - mij) } } 我能够在O(nlogn)时间内解决这个问题。这是一项大学研究任务。我所做的一切都表明这是不可能的。如果你能给我指出解决问题的正确方向,我将不胜感激。或者至少证明这是不可能的

我在设计算法时遇到了一个问题。问题是这应该在O(n)时间内执行

以下是作业: 存在一个包含n个数字的未排序数组“a”

mij=min{ai, ai+1, ..., aj}, Mij=max{ai, ai+1, ..., aj}
计算:

S=SUM[i=1,n] { SUM[j=i,n] { (Mij - mij) } }
我能够在O(nlogn)时间内解决这个问题。这是一项大学研究任务。我所做的一切都表明这是不可能的。如果你能给我指出解决问题的正确方向,我将不胜感激。或者至少证明这是不可能的


进一步解释:

给定
i
j
,求数组切片a[i:j]的最大和最小元素。减去这些值得到切片的范围,
a[max]-a[min]


现在,将所有(i,j)的所有切片的范围相加,这样
1这是一个非常直接的问题。
我将假设它是对象数组(如值对或元组),而不是数字。第一个值是数组中的索引,第二个值是值

正确的问题是,我们需要多少时间将每个数字相乘,然后从和中加/减,即在多少子序列中,它是最大和最小元素。 这个问题与寻找下一个最大元素(nge)有关,你们可以看到,只是为了知道它对未来的问题

我将用伪代码编写它

subsum (A):
    returnSum = 0
    //i am pushing object into the stack. Firt value is index in array, secong is value
    lastStackObject.push(-1, Integer.MAX_INT)
    for (int i=1; i<n; i++)
        next = stack.pop()
        stack.push(next)
        while (next.value < A[i].value)
            last = stack.pop()
            beforeLast = stack.peek()
            retrunSum = returnSum + last.value*(i-last.index)*(last.index-beforeLast.index)
        stack.push(A[i])

    while stack is not empty:
        last = stack.pop()
        beforeLast = stack.peek()
        retrunSum = returnSum + last.value*(A.length-last.index)*(last.index-beforeLast.index)

    return returnSum

sum(A)
    //first we calculate sum of maximum values in subarray, and then sum of minimum values. This is done by simply multiply each value in array by -1
    retrun subsum(A)+subsum(-1 for x in A.value)
subsum(A):
returnSum=0
//我正在把物体推入堆栈。第一个值是数组中的索引,第二个值是值
lastStackObject.push(-1,整数.MAX\u INT)

对于(inti=1;iQuestion不清楚。请提供正确的输入和所需的输出。S=SUM[1..n]SUM[i..n](Mij-Mij)是什么?@SomeDude:这是一个双总和,大写sigma。