我正在尝试解决加权区间调度问题。基本上,我想出了以下重现以获得最佳解决方案的长度:
optimum[i] = max(duration(intervals[i]) + opt[prior[i]], opt[i - 1])
其中prior [i] =在当前间隔开始之前完成的最新非重叠计划。
复发效果很好,我得到了正确的解决方案。但是,我想得到实际的时间表,而不仅仅是长度。我怎样才能做到这一点?我尝试从最大的p [i]值开始并跟随指针,直到我达到无/ -1 / Null,但这并不总是有效。我假设我需要跟踪要保留的间隔以及丢弃哪些间隔,因为我解决了上面的重现问题。我尝试做类似的事情:
if (duration(intervals[i]) + optimum[prior[i]] >= optimum[i - 1]) {
optimum[i] = duration(intervals[i]) + optimum[p[i]];
retain[i] = true;
}
else {
optimum[i] = optimum[i - 1];
retain[i] = false;
retain[i - 1] = true;
}
但这并没有奏效。
答案 0 :(得分:1)
您可以使用prior[i]
以及optimum[i]
来构建路径。具体而言,您从i
开始,使用最佳解决方案。然后可以得到如下路径。
queue<int> path;
int st = i;
while (st > 0) {
if (op[st] == op[st-1]) st = st -1;
else {
path.push(st);
st = prior[st];
}
}
pop each item from queue<int> path, you get the intervals you selected.