package com.interview.dynamic;
/**
* Date 03/10/2016
* @author Tushar Roy
*
* Given a 2D matrix find longest increasing path length in this matrix.
*
* Time complexity is O(n*m)
* Space complexity is O(n*m)
*
* Reference
* https://leetcode.com/problems/longest-increasing-path-in-a-matrix/
*/
public class LongestIncreasingPath {
public int longestIncreasingPath(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
int[][] distance = new int[matrix.length][matrix[0].length];
int max = 1;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
int r = dfs(matrix, i, j, distance, Integer.MIN_VALUE);
if (r > max) {
max = r;
}
}
}
return max;
}
int dfs(int[][] matrix, int i, int j, int[][] distance, int prev) {
if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[i].length) {
return 0;
}
if (matrix[i][j] <= prev) {
return 0;
}
if (distance[i][j] != 0) {
return distance[i][j];
}
int v1 = dfs(matrix, i - 1, j, distance, matrix[i][j]);
int v2 = dfs(matrix, i, j - 1, distance, matrix[i][j]);
int v3 = dfs(matrix, i + 1, j, distance, matrix[i][j]);
int v4 = dfs(matrix, i, j + 1, distance, matrix[i][j]);
distance[i][j] = 1 + Math.max(Math.max(v1, v2), Math.max(v3, v4));
return distance[i][j];
}
public static void main(String args[]) {
LongestIncreasingPath lip = new LongestIncreasingPath();
int[][] input = {{9, 9, 4},{6, 6, 8},{2, 1, 1}};
int[][] input1 = {{3, 4, 5}, {3, 2, 6}, {2, 2, 1}};
System.out.println(lip.longestIncreasingPath(input));
}
}