WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Dynamic Programming · Guru · question 96 of 100

Implement the solution to the Maximum Profit Job Scheduling with Release Times and Deadlines problem using dynamic programming.?

📕 Buy this interview preparation book: 100 Dynamic Programming questions & answers — PDF + EPUB for $5

The Maximum Profit Job Scheduling with Release Times and Deadlines problem involves finding a schedule for a set of jobs that maximizes the profit, where each job has a release time and a deadline. Here’s how we can solve this problem using dynamic programming:

First, let’s define the subproblems. Let S(i) be the maximum profit that can be achieved by scheduling jobs 1 through i, where job i is the last job to be scheduled.

To find the optimal solution, we need to solve for S(n), where n is the total number of jobs. Let’s see how we can build up to this solution using dynamic programming:

1. Sort the jobs by their deadlines in non-descending order. This ensures that we always consider the jobs that have earlier deadlines first.

2. Define an array dp[] where dp[i] is the maximum profit that can be achieved by scheduling jobs up to i. Initialize dp[0] to 0.

3. For each job j from 1 to n, find the latest job i that can be scheduled before j such that i’s deadline and release time are both before or equal to j’s deadline. Then, update dp[j] to be the maximum of two values: (a) the profit of scheduling job j plus dp[i], and (b) dp[j-1]. In other words, we either add job j to the schedule or skip it, depending on which option leads to a higher profit.

4. Return dp[n], which is the maximum profit achievable by scheduling all jobs.

Here’s the Java code that implements this algorithm:

public int maxProfit(int[] deadlines, int[] profits, int[] releaseTimes) {
    int n = deadlines.length;

    // Sort jobs by deadlines
    Job[] jobs = new Job[n];
    for (int i = 0; i < n; i++) {
        jobs[i] = new Job(deadlines[i], profits[i], releaseTimes[i]);
    }
    Arrays.sort(jobs);

    // Initialize dp[] array
    int[] dp = new int[n+1];

    // Calculate maximum profit for each subproblem
    for (int j = 1; j <= n; j++) {
        // Find the latest job i that can be scheduled before j
        int i = j-1;
        while (i > 0 && jobs[i-1].deadline >= jobs[j-1].releaseTime) {
            i--;
        }

        // Update dp[j] based on whether job j is included or skipped
        dp[j] = Math.max(dp[i] + jobs[j-1].profit, dp[j-1]);
    }

    return dp[n];
}

class Job implements Comparable<Job> {
    int deadline;
    int profit;
    int releaseTime;

    public Job(int deadline, int profit, int releaseTime) {
        this.deadline = deadline;
        this.profit = profit;
        this.releaseTime = releaseTime;
    }

    // Sort jobs by deadlines in non-descending order
    public int compareTo(Job other) {
        return this.deadline - other.deadline;
    }
}

As an example, let’s say we have the following input:

deadlines = {4, 2, 3, 1, 6}
profits = {20, 10, 15, 30, 5}
releaseTimes = {0, 0, 0, 0, 0}

After sorting the jobs by deadlines, we have:

deadlines = {1, 2, 3, 4, 6}
profits = {30, 10, 15, 20, 5}
releaseTimes = {0, 0, 0, 0, 0}

Using the dynamic programming algorithm, we get:

maxProfit(deadlines, profits, releaseTimes) = 60

This means that the maximum profit achievable by scheduling all jobs is 60, which can be attained by scheduling jobs 1, 3, and 4 in any order.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Dynamic Programming interview — then scores it.
📞 Practice Dynamic Programming — free 15 min
📕 Buy this interview preparation book: 100 Dynamic Programming questions & answers — PDF + EPUB for $5

All 100 Dynamic Programming questions · All topics