给定序列Y作为输入,选择序列X,使得C的值最大

时间:2017-02-09 13:54:03

标签: algorithm math sequence

给定两个整数序列X = (x1, x2, . . . , xn)Y = (y1, y2, . . . , yn)1 ≤ xi ≤ yi为所有1 ≤ i ≤ n

C = Summation(from i=2 to n) |xi − xi-1|

如果输入序列Y,我必须选择最大化X的序列C

这是我试过的:

我很容易发现,Summation(i=2 to n) | xi - xi-1 |xi = yi中的所有xi = 1来说in最大为$input

但我不知道如何以数学方式表示它。

2 个答案:

答案 0 :(得分:0)

| Xi-Xi-1 |在Xi=MAX(Yi)Xi-1=MIN(Yi)Xi=MIN(Yi)Xi-1=MAX(Yi)时最大化。

因此,如果1 ≤ xi ≤ yi for all 1 ≤ i ≤ n. (A)不成立,则X序列将为:

X = MAX(yi), MIN(yi), MAX(yi), MIN(yi).... 

X =  MIN(yi), MAX(yi), MIN(yi), MAX(Yi).... 

现在,因为我们需要完成(A),所以上述序列转换为:

MAX(yi) -> MAX(Yi) such that MAX(Yi)<=Yi <=> MAX(Yi)=Yi
MIN(Yi) -> MIN(Yi) such that MIN(Yi)<=Yi <=> MIN(Yi)=1

因此,总之,X序列是:

X = 1, Y2, 1, Y4.... 

X = Y1, 1, Y3, 1 ...

计算上述两者的Sum(|Xi-Xi-1|)将为您提供结果。

修改 正如您正确观察到的,每个Xi将是Yi或1.这意味着,对于给定的长度为N的Y序列,有效X序列的数量是2 ^ N.因此,一个简单的(蛮力,当然不是最优的)算法将是创建所有这些序列,计算相应的总和,并采用Sum最大的那个。

答案 1 :(得分:0)

正如您所正确观察到的,对于每个i,只有两个选项:xi = 1xi = yi。但是,这仍然会使2n序列留给蛮力。

幸运的是我们可以做得更好。我们可以循环索引并跟踪两个最大值:

  • xi = 1给出的最大金额,让我们称之为maxLow
  • xi = yi给出的最大金额,让我们称之为maxHigh

最后我们只需要取这两个中的最大值。

现在我们只需要一种更新这两个最大总和的方法,但这很简单。有4个案例:

  1. 代表xi-1 = 1xi = 1maxLow = maxLow + |1 - 1|
  2. 代表xi-1 = yi-1xi = 1maxLow = maxHigh + |1 - yi-1|
  3. 代表xi-1 = 1xi = yimaxHigh = maxLow + |yi - 1|
  4. 代表xi-1 = yi-1xi = yimaxHigh = maxHigh + |yi - yi-1|
  5. 在代码中:

    maxLow = 0
    maxHigh = 0
    
    for i = 2; i <= n; i++ {
        maxLow = max(maxLow, maxHigh + Y[i-1] - 1)
        maxHigh = max(maxLow + Y[i] - 1, maxHigh + abs(Y[i] - Y[i-1]))
    }
    
    result = max(maxLow, maxHigh)
    

    这显然可以在O(n)时间内完成。