NowCoder喜欢滑雪,因为滑雪的确很刺激。为了获得速度,必须从高处往低处滑。现在知道某片区域的海拔,如下所示
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
可以从某个点滑向上下左右四个方向中海拔比当前位置低的点。例如上图中一条可行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1是最长的一条。
现在给出区域的海拔,你能帮忙计算最长的滑道有多长吗?
输入描述:
输入包含多组数据。
每组数据的第一行包含两个正整数m和n (1≤m, n≤100),紧接着是m*n的海拔矩阵,包含各个点的高度h (1≤h≤10000)。
输出描述:
对应每一组数据,输出该区域最长的滑道长度。
输入例子:
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
2 2
1 1
1 1
输出例子:
25
1
解题
DFS
记录中间结果
不记录中间结果
import java.util.*; public class Main1{ public static void main(String [] args){ Scanner in = new Scanner(System.in); int m,n; int[][] A; int[][] value; int Max = -1; int subMax = -1; while(in.hasNext()){ Max = -1; subMax = -1; m = in.nextInt(); n = in.nextInt(); A = new int[m][n]; value = new int[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ A[i][j] = in.nextInt(); value[i][j] = -1; } } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ DFS(A,value,i,j,m,n); subMax = value[i][j]; Max = Max>subMax?Max:subMax; } } System.out.println(Max+1); } in.close(); } private static int DFS(int[][] A,int[][] value,int x,int y,int row,int col){ if(x<0 || x>=row || y<0 || y>=col){ return 0; } if(value[x][y]!=-1){ return value[x][y]; } int len1 = 0; int len2 = 0; int len3 = 0; int len4 = 0; if(x-1>=0 && A[x-1][y] < A[x][y]){ if(value[x-1][y]!=-1){ len1 = value[x-1][y] + 1; }else len1 = DFS(A,value,x-1,y,row,col) + 1; } if(x+1<row && A[x+1][y] < A[x][y]){ if(value[x+1][y]!=-1){ len2 = value[x+1][y] + 1; }else len2 = DFS(A,value ,x+1,y,row,col) + 1; } if(y-1 >=0 && A[x][y-1] < A[x][y]){ if(value[x][y-1]!=-1){ len3 = value[x][y-1] + 1; }else len3 = DFS(A,value,x,y-1,row,col) + 1; } if(y+1 <col && A[x][y+1] < A[x][y]){ if(value[x][y+1]!=-1){ len4 = value[x][y+1] + 1; }else len4 = DFS(A,value,x,y+1,row,col) + 1; } value[x][y] = Max(len1,len2,len3,len4); return value[x][y]; } private static int DFS(int[][] A,int x,int y,int row,int col){ if(x<0 || x>=row || y<0 || y>=col){ return 0; } int len1 = 0; int len2 = 0; int len3 = 0; int len4 = 0; if(x-1>=0 && A[x-1][y] < A[x][y]){ len1 = DFS(A,x-1,y,row,col) + 1; } if(x+1<row && A[x+1][y] < A[x][y]){ len2 = DFS(A,x+1,y,row,col) + 1; } if(y-1 >=0 && A[x][y-1] < A[x][y]){ len3 = DFS(A,x,y-1,row,col) + 1; } if(y+1 <col && A[x][y+1] < A[x][y]){ len4 = DFS(A,x,y+1,row,col) + 1; } return Max(len1,len2,len3,len4); } private static int Max(int a,int b,int c,int d){ a = a>b?a:b; a = a>c?a:c; a = a>d?a:d; return a; } }