Greedy Algorithm
A activity-selection problem

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();
	}
}
			
Huffman Codes

Reference