zoukankan      html  css  js  c++  java
  • 滑雪_poj_1088(记忆化搜索).java

    滑雪
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 67987   Accepted: 25013

    Description

    Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 
     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更长。事实上,这是最长的一条。

    Input

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

    Output

    输出最长区域的长度。

    Sample Input

    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
    

    Sample Output

    25
    import java.util.Scanner;
    public class Main{//记忆化搜索,
    	/*
    	注意:java中千万不要用max=max>sum?max:sum这个做比较,这个很费时间,java会超时
    	*/
    	private static int a[][],b[][],n,m;
    	public static void main(String[] args) {
    		Scanner input=new Scanner(System.in);
    		while(input.hasNext()){
    			n=input.nextInt();
    			m=input.nextInt();
    			int max=0;
    			a=new int[n+3][m+3];
    			b=new int[n+3][m+3];
    			for(int i=1;i<=n;i++)
    				for(int j=1;j<=m;j++){
    					a[i][j]=input.nextInt();
    				}
    			for(int i=1;i<=n;i++){
    				for(int j=1;j<=m;j++){
    					b[i][j]=f(i,j);
    					if(b[i][j]>max)
    						max=b[i][j];
    				}
    			}
    			System.out.println(max);
    		}
    	}
    	private static int f(int i, int j) {
    		int max=0;
    		if(i<1||j<1||i>n||j>m)//超出边界返回0
    			return 0;
    		if(b[i][j]>0)//查过直接返回
    			return b[i][j];
    		if(a[i-1][j]<a[i][j]){//下搜
    			int sum=f(i-1,j);//定义一个中间值,记录四个方向的最大值
    			max=sum;//记录四个方向的最大值
    		}
    		if(a[i+1][j]<a[i][j]){//上搜
    			int sum=f(i+1,j);
    			if(sum>max)
    				max=sum;
    		}
    		if(a[i][j-1]<a[i][j]){//左搜
    			int sum=f(i,j-1);
    			if(sum>max)
    				max=sum;
    		}
    		if(a[i][j+1]<a[i][j]){//右搜
    			int sum=f(i,j+1);
    			if(sum>max)
    				max=sum;
    		}
    		return max+1;//本身也算一个,所以+1,否则得出的结果是0
    	}
    }



  • 相关阅读:
    day7 面向对象 静态方法 类方法 属性方法 类的特殊成员方法 元类 反射 异常处理
    day6 面向对象 封装 继承 多态 类与实例在内存中的关系 经典类和新式类
    day5 time datetime random os sys shutil json pickle shelve xml configparser hashlib subprocess logging re正则 python计算器
    kafka常用操作命令
    linux基础
    django学习1——初识web应用程序
    mysql数据库(三)——pymysql模块
    mysql数据库(二)——表的查询
    mysql数据库(一)
    Python常用模块——re模块
  • 原文地址:https://www.cnblogs.com/pangblog/p/3249155.html
Copyright © 2011-2022 走看看