Lattice Paths

/*
*  Problem: Lattice Paths - Pure Recursion
*
*  Prompt:  Count the number of unique paths to travel from the top left
*           corder to the bottom right corner of a lattice of M x N squares.
*
*           When moving through the lattice, one can only travel to the adjacent
*           corner on the right or down.
*
*  Input:   m {Integer} - rows of squares
*  Input:   n {Integer} - column of squares
*  Output:  {Integer}
*
*  Example: input: (2, 3)
*
*           (2 x 3 lattice of squares)
*            __ __ __
*           |__|__|__|
*           |__|__|__|
*
*           output: 10 (number of unique paths from top left corner to bottom right)
*
*  Resource: https://projecteuler.net/problem=15
*
*/

 

Using Recursion

class LatticePaths {
	public static int count;
  public static int compute(int m, int n) {
    // YOUR WORK HERE
	  count = 0;
   countLatticePaths(0, 0, m, n);
   return count;
  }
  
  private static void countLatticePaths(int i, int j, int m, int n) {
	  if(i == m && j == n) {
		  count++;
		  return;
	  }
	  
	  if(i > m || j > n)
		  return;
		  countLatticePaths(i+1, j, m, n);
		  countLatticePaths(i, j+1, m ,n);
  }
}

Using DP

private static int countLatticePathsDP(int m, int n) {
	  int[][] matrix = new int[m+1][n+1];
	  for(int i = 0; i < m; i++)
		  matrix[i][0] = 1;
	  for(int i = 0; i < n; i++)
		  matrix[0][i] = 1;
	  for(int i = 1; i <= m; i++) {
		  for(int j = 1; j <= n; j++) {
			  matrix[i][j] += matrix[i-1][j] + matrix[i][j-1];
		  }
	  }
	  return matrix[m][n];
  }