- public class P
- {
- private int s, f;
-
- public P(int s, int f)
- {
- this.s = s;
- this.f = f;
- }
-
- public int getS() {return s;}
- public int getF() {return f;}
- }
-
- //Top-Down
- import java.util.*;
- import javafx.util.*;
-
- public class A
- {
- public static int firstEnd(P [] array, int start, int current)
- {
- if(start >= current)
- return start-1;
-
- int i;
- for(i = current-1; i >= start; i--)
- {
- if(array[i].getF() <g array[current].getS())
- return i;
- }
- return i;
- }
-
- public static int secondStart(P [] array, int current, int end)
- {
- if(current >= end)
- return end+1;
-
- int i;
- for(i = current+1; i <= end; i++)
- {
- if(array[i].getS() > array[current].getF())
- return i;
- }
- return i;
- }
-
- public static int activities(P [] array, int start, int end)
- {
- if(start > end)
- return 0;
-
- int max = Integer.MIN_VALUE;
-
- for(int i = start; i <= end; i++)
- {
- int first = firstEnd(array, start, i);
- int second = secondStart(array, i, end);
- max = Math.max(max, activities(array, start, first)+activities(array, second, end)+1);
- }
-
- return max;
- }
-
- public static void main(String args[])
- {
- P [] array = new P[11];
-
- array[0] = new P(1, 4);
- array[1] = new P(3, 5);
- array[2] = new P(0, 6);
- array[3] = new P(5, 7);
- array[4] = new P(3, 9);
- array[5] = new P(5, 9);
- array[6] = new P(6, 10);
- array[7] = new P(8, 11);
- array[8] = new P(8, 12);
- array[9] = new P(2, 14);
- array[10] = new P(12, 16);
-
- System.out.println(activities(array, 0, array.length-1));
- }
- }
-
- //Top-Down with Memorization
- import java.util.*;
- import javafx.util.*;
-
- public class A
- {
- public static int firstEnd(P [] array, int start, int current)
- {
- if(start >= current)
- return start-1;
-
- int i;
- for(i = current-1; i >= start; i--)
- {
- if(array[i].getF() < array[current].getS())
- return i;
- }
- return i;
- }
-
- public static int secondStart(P [] array, int current, int end)
- {
- if(current >= end)
- return end+1;
-
- int i;
- for(i = current+1; i <= end; i++)
- {
- if(array[i].getS() > array[current].getF())
- return i;
- }
- return i;
- }
-
- public static int activities(P [] array, int start, int end, int [][] c)
- {
- if(start > end)
- return 0;
-
- if(c[start][end] > 0)
- return c[start][end];
-
- int max = Integer.MIN_VALUE;
-
- for(int i = start; i <= end; i++)
- {
- int first = firstEnd(array, start, i);
- int second = secondStart(array, i, end);
- max = Math.max(max, activities(array, start, first, c)+activities(array, second, end, c)+1);
- }
-
- c[start][end] = max;
- return max;
- }
-
- public static void main(String args[])
- {
- P [] array = new P[11];
-
- array[0] = new P(1, 4);
- array[1] = new P(3, 5);
- array[2] = new P(0, 6);
- array[3] = new P(5, 7);
- array[4] = new P(3, 9);
- array[5] = new P(5, 9);
- array[6] = new P(6, 10);
- array[7] = new P(8, 11);
- array[8] = new P(8, 12);
- array[9] = new P(2, 14);
- array[10] = new P(12, 16);
-
- int [][] c = new int[11][11];
-
- System.out.println(activities(array, 0, array.length-1,c));
- }
- }
-
- //Bottom-Up
- import java.util.*;
- import javafx.util.*;
-
- public class A
- {
- public static int firstEnd(P [] array, int start, int current)
- {
- if(start >= current)
- return start-1;
-
- int i;
- for(i = current-1; i >= start; i--)
- {
- if(array[i].getF() < array[current].getS())
- return i;
- }
- return i;
- }
-
- public static int secondStart(P [] array, int current, int end)
- {
- if(current >= end)
- return end+1;
-
- int i;
- for(i = current+1; i <= end; i++)
- {
- if(array[i].getS() > array[current].getF())
- return i;
- }
- return i;
- }
-
- public static int activities(P [] array, int start, int end)
- {
- int [][] c = new int[array.length][array.length];
-
-
- for(int row = 0; row < array.length; row++)
- {
- for(int column = 0; column < array.length; column++)
- {
- if(row > column)
- continue;
- int max = Integer.MIN_VALUE;
- for(int i = row; i <= column; i++)
- {
- int first = firstEnd(array, row, i);
- int second = secondStart(array, i, column);
- int firstPart, secondPart;
- if(row > first)
- firstPart = 0;
- else
- firstPart = c[row][first];
- if(second > column)
- secondPart = 0;
- else
- secondPart = c[second][column];
- max = Math.max(max, firstPart+secondPart+1);
- }
- c[row][column] = max;
- }
- }
-
- return c[start][end];
- }
-
- public static void main(String args[])
- {
- P [] array = new P[11];
-
- array[0] = new P(1, 4);
- array[1] = new P(3, 5);
- array[2] = new P(0, 6);
- array[3] = new P(5, 7);
- array[4] = new P(3, 9);
- array[5] = new P(5, 9);
- array[6] = new P(6, 10);
- array[7] = new P(8, 11);
- array[8] = new P(8, 12);
- array[9] = new P(2, 14);
- array[10] = new P(12, 16);
-
- System.out.println(activities(array, 0, array.length-1));
- }
- }
-
- //Bottom-Up with Constructing Subset
- /** An activity-selection problem in CLRS Ch16.1
- * @author Lin Chen
- * @since 11.14.2017
- */
- import java.util.*;
- import javafx.util.*;
-
- public class A
- {
- /** Get the valid activity before the current activity
- * @param array array of activities
- * @param start index of start activity
- * @param current index of current activity
- * @return {@code int}, index of valid activity before current activity
- */
- public static int firstEnd(P [] array, int start, int current)
- {
- if(start >= current)
- return start-1;
-
- int i;
- for(i = current-1; i >= start; i--)
- {
- if(array[i].getF() < array[current].getS())
- return i;
- }
- return i;
- }
-
- /** Get the valid activity after the current activity
- * @param array array of activities
- * @param current index of current activity
- * @param end index of end activity
- * @return {@code int}, index of valid activity after current activity
- */
- public static int secondStart(P [] array, int current, int end)
- {
- if(current >= end)
- return end+1;
-
- int i;
- for(i = current+1; i <= end; i++)
- {
- if(array[i].getS() > array[current].getF())
- return i;
- }
- return i;
- }
-
- /** Bottom-up with constructing set consisting of mutually compatible activities
- * @param array array of activities
- * @param start index of start activity
- * @param end index of end activity
- * @param s array to save a[k] to maximum c[start, end]
- * @return {@code int}, number of available mutually compatible activities
- */
- public static int activities(P [] array, int start, int end, int [][] s)
- {
- int [][] c = new int[array.length][array.length];
-
- for(int row = 0; row < array.length; row++)
- {
- for(int column = 0; column < array.length; column++)
- {
- if(row > column)
- continue;
- int max = Integer.MIN_VALUE;
- for(int i = row; i <= column; i++)
- {
- int first = firstEnd(array, row, i);
- int second = secondStart(array, i, column);
- int firstPart, secondPart;
- if(row > first)
- firstPart = 0;
- else
- firstPart = c[row][first];
- if(second > column)
- secondPart = 0;
- else
- secondPart = c[second][column];
- if(max < firstPart+secondPart+1)
- {
- max = firstPart+secondPart+1;
- s[row][column] = i;
- }
- }
- c[row][column] = max;
- }
- }
-
- return c[start][end];
- }
-
- /** print the maximum subset
- * @param array array of activities
- * @param s array to save a[k] to maximum c[start, end]
- * @param start index of start activity
- * @param end index of end activity
- */
- public static void printActivity(P [] array, int [][] s, int start, int end)
- {
- if(start > end)
- return;
- printActivity(array, s, start, firstEnd(array, start, s[start][end]));
- System.out.printf("%5d", s[start][end]);
- printActivity(array, s, secondStart(array, s[start][end], end), end);
- }
-
- /** print array
- * @param array integer array
- */
- public static void display(int [][] array)
- {
- for(int i = 0; i < array.length; i++)
- {
- for(int j = 0; j < array[0].length; j++)
- {
- System.out.printf("%5d", array[i][j]);
- }
- System.out.println();
- }
- }
-
- public static void main(String args[])
- {
- P [] array = new P[11];
-
- array[0] = new P(1, 4);
- array[1] = new P(3, 5);
- array[2] = new P(0, 6);
- array[3] = new P(5, 7);
- array[4] = new P(3, 9);
- array[5] = new P(5, 9);
- array[6] = new P(6, 10);
- array[7] = new P(8, 11);
- array[8] = new P(8, 12);
- array[9] = new P(2, 14);
- array[10] = new P(12, 16);
-
- int [][] s = new int[array.length][array.length];
-
- System.out.println(activities(array, 0, array.length-1, s));
-
- //display(s);
-
- printActivity(array, s, 0, array.length-1);
- System.out.println();
- }
- }
-
- //Greedy Algorithm, O(n)
- /** An activity-selection problem in CLRS Ch16.1
- * @author Lin Chen
- * @since 11.14.2017
- */
- import java.util.*;
- import javafx.util.*;
-
- public class A
- {
- /** Bottom-up with constructing set consisting of mutually compatible activities
- * @param array array of activities
- * @param start index of current activity
- * @param end index of end activity
- * @param records store activities
- */
- public static void activitySelector(P [] array, int current, int end, ArrayList<Integer> records)
- {
- int m = current + 1;
-
- while(m <= end && array[m].getS() < array[current].getF())
- m++;
-
- if(m <= end)
- {
- records.add(m);
- activitySelector(array, m, end, records);
- }
- }
-
- public static void main(String args[])
- {
- P [] array = new P[11];
-
- //sort activities by increasing finish time
- array[0] = new P(1, 4);
- array[1] = new P(3, 5);
- array[2] = new P(0, 6);
- array[3] = new P(5, 7);
- array[4] = new P(3, 9);
- array[5] = new P(5, 9);
- array[6] = new P(6, 10);
- array[7] = new P(8, 11);
- array[8] = new P(8, 12);
- array[9] = new P(2, 14);
- array[10] = new P(12, 16);
-
- ArrayList<Integer> records = new ArrayList<Integer>();
-
- records.add(0);
- activitySelector(array, 0, array.length-1, records);
-
- for(Integer e : records)
- System.out.printf("%5d", e);
- System.out.println();
- }
- }
-
- //Iterative Greedy Algorithm, O(n)
- /** An activity-selection problem in CLRS Ch16.1
- * @author Lin Chen
- * @since 11.14.2017
- */
- import java.util.*;
- import javafx.util.*;
-
- public class A
- {
- /** Bottom-up with constructing set consisting of mutually compatible activities
- * @param array array of activities
- * @param start index of current activity
- * @param end index of end activity
- * @param records store activities
- */
- public static ArrayList<Integer> activitySelector(P [] array)
- {
- ArrayList<Integer> records = new ArrayList<Integer>();
-
- records.add(0);
-
- int n = array.length;
- int k = 0;
-
- for(int m = 2; m < n; m++)
- {
- if(array[m].getS() >= array[k].getF())
- {
- records.add(m);
- k = m;
- }
- }
-
- return records;
- }
-
- public static void main(String args[])
- {
- P [] array = new P[11];
-
- //sort activities by increasing finish time
- array[0] = new P(1, 4);
- array[1] = new P(3, 5);
- array[2] = new P(0, 6);
- array[3] = new P(5, 7);
- array[4] = new P(3, 9);
- array[5] = new P(5, 9);
- array[6] = new P(6, 10);
- array[7] = new P(8, 11);
- array[8] = new P(8, 12);
- array[9] = new P(2, 14);
- array[10] = new P(12, 16);
-
- ArrayList<Integer> records = activitySelector(array);
-
- for(Integer e : records)
- System.out.printf("%5d", e);
- System.out.println();
- }
- }
-