Given a set of n jobs with [start time, end time, cost] find a subset so that no 2 jobs overlap and the cost is maximum.
Job: (start_time, end_time] --- cost
如果只是求maxCost, 一维就可以做。
但是如果要知道有选了哪些job,则需要存成二维。
1 package leetcode; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Comparator; 6 7 class Job{ 8 Integer start_time; 9 Integer end_time; 10 Integer cost; 11 public Job(Integer s, Integer e, Integer c){ 12 start_time = s; 13 end_time = e; 14 cost = c; 15 } 16 17 public String toString(){ 18 StringBuilder sb = new StringBuilder(); 19 sb.append("Job: start [" + start_time + "], end ["+ end_time + "], cost [" + cost + "];"); 20 return sb.toString(); 21 } 22 } 23 24 public class FindNonOverlapJobs { 25 public static ArrayList<Job> findJobsWithMaxCost(Job[] jobList){ 26 ArrayList<Job> result = new ArrayList<Job> (); 27 if(jobList == null || jobList.length == 0) return result; 28 Arrays.sort(jobList, new Comparator<Job>(){ 29 public int compare(Job j1, Job j2){ 30 return j1.end_time > j2.end_time ? 1 : (j1.end_time == j2.end_time ? 0 : -1); 31 } 32 }); 33 int len = jobList.length; 34 int[][] dp = new int[len + 1][jobList[len - 1].end_time + 1]; 35 for(int i = 1; i <= len; i ++){ 36 Job tmp = jobList[i - 1]; 37 int start = tmp.start_time; 38 int end = tmp.end_time; 39 for(int j = 0; j < dp[0].length; j ++){ 40 if(j < end){ 41 dp[i][j] = dp[i - 1][j]; 42 }else if(j == end){ 43 dp[i][j] = Math.max(dp[i - 1][start] + tmp.cost, dp[i - 1][j]); 44 }else{ 45 dp[i][j] = dp[i][j - 1]; 46 } 47 } 48 } 49 50 int i = dp[0].length - 1; 51 while(i > 0){ 52 if(dp[len][i] == dp[len][i - 1]) i --; 53 else{ 54 int j = len; 55 while(j > 0 && dp[j][i] == dp[j - 1][i]) j --; 56 result.add(jobList[j - 1]); 57 i --; 58 } 59 } 60 return result; 61 } 62 63 public static void main(String[] args){ 64 Job[] test = new Job[5]; 65 test[0] = new Job(1,3,4); 66 test[1] = new Job(3,5,2); 67 test[2] = new Job(2,3,3); 68 test[3] = new Job(1,2,2); 69 test[4] = new Job(2,6,3); 70 ArrayList<Job> result = findJobsWithMaxCost(test); 71 for(int i = 0; i < result.size(); i ++){ 72 System.out.println(result.get(i).toString()); 73 } 74 } 75 }
Output:
Job: start [3], end [5], cost [2];
Job: start [2], end [3], cost [3];
Job: start [1], end [2], cost [2];