给定一系列x(i),i从1到N,假设N = 10,000。
for any i < j,
D(i,j) = x(i) - x(j), if x(i) > x (j); or,
= 0, if x(i) <= x(j).
定义
Dmax(im, jm) := max D(i,j), for all 1 <= i < j <=N.
计算Dmax,im和jm的最佳算法是什么?
我尝试使用动态编程,但这似乎不可分割......然后我有点迷失了...你们可以建议一下吗?是回溯了出路?
答案 0 :(得分:2)
迭代该系列,跟踪以下值:
对于每个元素,新的最大下降有两个可能的值:
maximumElementSoFar - newElement
所以选择一个给出更高价值的那个。迭代结束时的最大下降将是您的结果。这将在线性时间和恒定的额外空间中起作用。
答案 1 :(得分:0)
如果我理解正确你有一个数字数组,并想找到数组中两个相邻元素之间最大的正差异?
由于你将不得不至少经历一次数组,以计算差异,我不明白为什么你不能只是记录到目前为止发现的最大差异(及其位置),随着更改而更新。
如果您的问题像我理解的那样简单,我不确定您为什么需要考虑动态编程。我希望我误解了这个问题。
答案 2 :(得分:0)
Dmax(im, jm) := max D(i,j) = max(x(i) -x(j),0) = max(max(x(i) -x(j)),0)
你只需要为所有值计算x(i)-x(j),即O(n ^ 2),然后得到最大值。无需动态编程。
答案 3 :(得分:0)
您可以将系列x(i)划分为子系列,其中每个子系列包含x(i)的子列表和降序(例如,如果x = 5,4,1,2,1则x1 = 5,4, 1和x2 = 2,1)然后在每个子列表中你可以做:first_in_sub_series - last_sub_series然后比较你得到的所有结果并找到最大值,这就是答案。
如果我理解正确的问题,这应该为您提供一个基本的线性算法来解决它。
e.g:
x = 5, 4, 1, 2, 1 then x1 = 5, 4, 1 and x2 = 2, 1
rx1 = 4
rx2 = 1
dmax = 4且im = 1且jm = 3,因为我们讨论的是x1,它是x的前3项。