poj-1088-滑雪(记忆化搜索)

来源:互联网 发布:图片修改软件 编辑:程序博客网 时间:2024/05/21 18:50
滑雪
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 68035 Accepted: 25028

Description

Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
 1  2  3  4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

Output

输出最长区域的长度。

Sample Input

5 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9

Sample Output

25

Source

SHTSC 2002
 
import java.util.Scanner;public class Main {/** * @param args */static int[][]a;static int[][] b;//记录每个点的最长区域的长度static int R;static int C;public static void main(String[] args) {// TODO Auto-generated method stubScanner input=new Scanner(System.in);while(input.hasNext()){int max=0;R=input.nextInt();C=input.nextInt();a=new int[R][C];b=new int[R][C];for(int i=0;i<R;i++)for(int j=0;j<C;j++){a[i][j]=input.nextInt();}for(int i=0;i<R;i++)for(int j=0;j<C;j++){int temp=dfs(i,j);//以每个点为起点的最长区域的长度if(temp>max)max=temp;}System.out.println(max);}}private static int dfs(int i, int j) {// TODO Auto-generated method stubint temp=0,max=0;if(b[i][j]!=0)return b[i][j];if(i-1>=0&&a[i-1][j]<a[i][j]){temp=dfs(i-1,j);if(temp>max)max=temp;}//上if(i+1<R&&a[i+1][j]<a[i][j]){temp=dfs(i+1,j);if(temp>max)max=temp;}//下if(j-1>=0&&a[i][j-1]<a[i][j]){temp=dfs(i,j-1);if(temp>max)max=temp;}//左if(j+1<C&&a[i][j+1]<a[i][j]){temp=dfs(i,j+1);if(temp>max)max=temp;}//右return b[i][j]=max+1;}}

原创粉丝点击