Algorithm 作业之间的最小间隔

Algorithm 作业之间的最小间隔,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我试图解决一个问题,最小化数组中给定作业之间的时间间隔之和。该工作的结构如下: struct Job{ int start, end; }; 功能原型为: int impatientBob(Job jobs[], int n, int k) 作业不能重叠,我必须从数组中选择k个作业,如果不可能,则返回-1。此外,数组按作业的结束时间排序,时间以分钟为单位。 我没有什么好主意,因为我对动态编程还是很陌生。我能想到的一个解决方案是复杂度O(n^2*k) 您可以这样做(以下只是一个伪代码): 编辑

我试图解决一个问题,最小化数组中给定作业之间的时间间隔之和。该工作的结构如下:

struct Job{ int start, end; };
功能原型为:

int impatientBob(Job jobs[], int n, int k)
作业不能重叠,我必须从数组中选择k个作业,如果不可能,则返回-1。此外,数组按作业的结束时间排序,时间以分钟为单位。
我没有什么好主意,因为我对动态编程还是很陌生。

我能想到的一个解决方案是复杂度
O(n^2*k)

您可以这样做(以下只是一个伪代码):

编辑:添加更具体的代码

int memo[N][N][K]; // Should be initialized with -1

int minTimeIntervals(int current_index, int last_taken, int k){
    if(k == 0) return 0;
    if(current_index == N) return 1<<27; // 2^27, Just a big number.

    if(last_taken != -1 && memo[current_index][last_taken][k] != -1) return memo[current_index][last_taken][k];

    int decision1 = minTimeIntervals(current_index + 1, last_taken, k);
    int decision2 = 1<<27;
    if(last_taken == -1 || jobs[current_index].start >= jobs[last_taken].end){
        decision2 = minTimeIntervals(current_index + 1, current_index, k - 1) + (jobs[current_index].start - jobs[last_taken].end);
    }
    int result = min(decision1, decision2);
    memo[current_index][last_taken][k] = result;
    return result;
}
int memo[N][N][K];//应使用-1初始化
int最小时间间隔(int当前索引、int上次获取、int k){
如果(k==0)返回0;

如果(current_index==N)返回1我能想到的一个解决方案是复杂度
O(N^2*k)

您可以这样做(以下只是一个伪代码):

编辑:添加更具体的代码

int memo[N][N][K]; // Should be initialized with -1

int minTimeIntervals(int current_index, int last_taken, int k){
    if(k == 0) return 0;
    if(current_index == N) return 1<<27; // 2^27, Just a big number.

    if(last_taken != -1 && memo[current_index][last_taken][k] != -1) return memo[current_index][last_taken][k];

    int decision1 = minTimeIntervals(current_index + 1, last_taken, k);
    int decision2 = 1<<27;
    if(last_taken == -1 || jobs[current_index].start >= jobs[last_taken].end){
        decision2 = minTimeIntervals(current_index + 1, current_index, k - 1) + (jobs[current_index].start - jobs[last_taken].end);
    }
    int result = min(decision1, decision2);
    memo[current_index][last_taken][k] = result;
    return result;
}
int memo[N][N][K];//应使用-1初始化
int最小时间间隔(int当前索引、int上次获取、int k){
如果(k==0)返回0;

如果(当前_索引==N)return 1非常感谢您的算法。:)不客气!如果您在实现该算法时有任何问题,请告诉我。是的,我有一个问题。我应该使用二维数组来记忆连续和吗?通常情况下,您将使用与维数相同的状态数。在这种情况下,如果您在名为m的数组中进行记忆,则您可以执行类似于m[当前索引][上次拍摄][k]的操作=结果。我不太了解问题的大小以及这是否占用了太多内存。但是如果需要,可以使用一些技巧来减少内存大小。您能帮我实现吗?我仍然不明白。非常感谢您的算法。:)不客气!如果您对实现该算法有任何疑问或问题,请告诉我在。是的,我有一个问题。我应该使用二维数组来记忆连续的和吗?通常情况下,你会使用与维数相同的状态数。在这种情况下,如果你在一个名为m的数组中进行记忆,那么你可以执行类似于m[当前索引][上次获取][k]的操作=结果。我不太了解问题大小以及这是否占用了太多内存。但是如果需要,可以使用一些技巧来减少内存大小。您能帮我实现吗?我仍然不明白。如果通过“作业之间的时间间隔”,您是指由于等待可用作业到达而没有作业运行的空闲期,O(n lg n)最长可用作业算法应该是最优的。该算法将尽可能避免空闲期。(或者我是否将硬启动要求与到达时间混淆?)是的,它是关于最小化所有空闲时间的总和。请详细说明一下,好吗?若“作业之间的时间间隔”是指由于等待可用作业到达而并没有作业运行的空闲时间,那个么O(n lg n)最长可用作业算法应该是最优的。该算法将尽可能避免空闲时间。(或者我把硬启动要求和到达时间混淆了吗?)是的,它是关于最小化所有空闲时间的总和。请详细说明一下?