题意:找出2维数组中连续升序最长的值
思路:采用DFS,遍历每一个数字,找出所有的可能并取得最大值,并用另外一个数组记录当前访问过节点的可能最大值,其中可以减枝,如果当前点比他的邻点小而且他的相邻点的已经记录的值不大于当前记录的值+1,则继续下一个邻点,用一个二维数组记录每一个节点的当前最大可能值
public class Solution {
int max = 1;
public int longestIncreasingPath(int[][] matrix) {
int m = matrix.length;
if(m==0)
return 0;
int n = matrix[0].length;
int[][] dp = new int[m][n];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(dp[i][j]==0)
dp[i][j] = 1;
dfs(matrix, i, j, dp, m, n);
}
}
return max;
}
void dfs(int[][] matrix, int i, int j, int[][] dp, int m, int n){
if(i-1>=0&&matrix[i-1][j]>matrix[i][j]&&dp[i-1][j]<=dp[i][j]+1)
{
dp[i-1][j] = dp[i][j] + 1;
if(max < dp[i-1][j])
max = dp[i-1][j];
dfs(matrix, i-1, j, dp, m, n);
}
if(j-1>=0&&matrix[i][j-1]>matrix[i][j]&&dp[i][j-1]<=dp[i][j]+1)
{
dp[i][j-1] = dp[i][j] + 1;
if(max < dp[i][j-1])
max = dp[i][j-1];
dfs(matrix, i, j-1, dp, m, n);
}
if(i+1<m&&matrix[i+1][j]>matrix[i][j]&&dp[i+1][j]<=dp[i][j]+1)
{
dp[i+1][j] = dp[i][j] + 1;
if(max < dp[i+1][j])
max = dp[i+1][j];
dfs(matrix, i+1, j, dp, m, n);
}
if(j+1<n&&matrix[i][j+1]>matrix[i][j]&&dp[i][j+1]<=dp[i][j]+1)
{
dp[i][j+1] = dp[i][j] + 1;
if(max < dp[i][j+1])
max = dp[i][j+1];
dfs(matrix, i, j+1, dp, m, n);
}
}
}