给定两个整数序列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
来说i
或n
最大为$input
。
但我不知道如何以数学方式表示它。
答案 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 = 1
或xi = yi
。但是,这仍然会使2n
序列留给蛮力。
幸运的是我们可以做得更好。我们可以循环索引并跟踪两个最大值:
xi = 1
给出的最大金额,让我们称之为maxLow
,xi = yi
给出的最大金额,让我们称之为maxHigh
最后我们只需要取这两个中的最大值。
现在我们只需要一种更新这两个最大总和的方法,但这很简单。有4个案例:
xi-1 = 1
和xi = 1
:maxLow = maxLow + |1 - 1|
xi-1 = yi-1
和xi = 1
:maxLow = maxHigh + |1 - yi-1|
xi-1 = 1
和xi = yi
:maxHigh = maxLow + |yi - 1|
xi-1 = yi-1
和xi = yi
:maxHigh = maxHigh + |yi - yi-1|
在代码中:
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)
时间内完成。