acm 1088 滑雪

题目:http://poj.org/problem?id=1088

花了好久才写完的。。。脑子不好使啊

  
  
  
  
  1. package dynamicprogramming;  
  2. /**  
  3.  * 滑雪问题  
  4.  * array 数组表示高山  
  5.  * @author dongdong  
  6.  *  
  7.  */ 
  8. public class Skiing {  
  9.       
  10.     private static int Max = 99;  //加边框,这样后面无需边界判断
  11.     static int[][] array2 =   
  12.        {{1 ,  2,  3,  45},  
  13.         {161718196},  
  14.         {152425207},  
  15.         {142322218},  
  16.         {131211109}};  
  17.     static int[][] array =   
  18.         {{22 ,21201918},  
  19.          {1617181917},  
  20.          {1524252013},  
  21.          { 6,  3,  214,  8},  
  22.          { 5,  4,  110,  9}};  
  23.     static int row = 5;  
  24.     static int column = 5;    
  25.     static int[][] len = new int[row+2][column+2];//每一点能滑雪的最长距离  
  26.     static boolean[][] flag = new boolean[row+2][column+2];//标记是否该点的最长距离已经被计算过  
  27.     static{  
  28.         for (int i = 0; i < flag.length; i++) {  
  29.             for (int j = 0; j < flag[0].length; j++) {  
  30.                 flag[i][j] = false;  
  31.             }  
  32.         }  
  33.     }  
  34.     static  int[][] orients1 ={{0,1},{1,0},{0,-1},{-1,0}};   
  35.     static  int[][] orients ={{0,-1},{-1,0},{0,1},{1,0}}; //四个方向,先后没有关系  
  36.       
  37.     public static void main(String[] args){       
  38.         array = wrap(array,row,column);  
  39.         print(array);  
  40.         int d = dpCalLongestDistance(row,column);  
  41.         System.out.println("longest distance is :"+ d);  
  42.     }  
  43.  
  44.     /**  
  45.      * 动态规划找最长路径  
  46.      * @param row  
  47.      * @param column  
  48.      * @return  
  49.      */ 
  50.     private static int dpCalLongestDistance(int row, int column) {  
  51.           
  52.         int longest = 0;  
  53.         for (int i = 1; i <= row; i++)  
  54.             for (int j = 1; j <= column; j++) {  
  55.                 len[i][j]= dp(i,j);  
  56.                 if(len[i][j]>longest)  
  57.                     longest= len[i][j];  
  58.             }  
  59.           
  60.         print(len);  
  61.                   
  62.         return longest;  
  63.     }  
  64.  
  65.     /**  
  66.      *   
  67.      *  len[i][j]= max{len[周围]} + 1,    each len[k]<len[i][j]  
  68.      *             1,                     all(len[周围])>len[i][j]  
  69.      * @param i  
  70.      * @param j  
  71.      * @return  
  72.      */ 
  73.     private static int dp(int i, int j) {  
  74.         int max = 1;  
  75.         for (int k = 0; k < 4; k++) {  
  76.             if (array[i][j] > array[i + orients[k][0]][j + orients[k][1]]) {  
  77.                 if (!flag[i + orients[k][0]][j + orients[k][1]]) {  
  78.                     int tmp = dp(i + orients[k][0], j + orients[k][1]) + 1;  
  79.                     if (tmp > max)  
  80.                         max = tmp;  
  81.                 } else 
  82.                     max = len[i + orients[k][0]][j + orients[k][1]] + 1;  
  83.             }  
  84.         }  
  85.         return max;  
  86.     }  
  87.  
  88.     public static void  print(int[][] array){  
  89.         for(int i=0;i<array.length;i++){  
  90.             for (int j = 0; j < array[0].length; j++) {  
  91.                 if(array[i][j]/10>0)  
  92.                     System.out.print(array[i][j]+" " );  
  93.                 else 
  94.                     System.out.print(" "+array[i][j]+" " );  
  95.                       
  96.             }  
  97.             System.out.println();  
  98.         }  
  99.     }  
  100.       
  101.     private static int[][] wrap(int[][] mountains,int row, int column) {  
  102.  
  103.         int[][] m2 = new int[row+2][column+2];   
  104.         for(int i = 0;i<row+2;i++){  
  105.             m2[i][0]=Max;  
  106.             m2[i][column+1]=Max;  
  107.         }  
  108.         for(int j = 0;j<column+2;j++){  
  109.             m2[0][j]=Max;  
  110.             m2[row+1][j]=Max;  
  111.         }  
  112.           
  113.         for(int i=1;i<=row;i++)  
  114.             for (int j =1; j <=column; j++)   
  115.                 m2[i][j]=mountains[i-1][j-1];  
  116.           
  117.         return m2;  
  118.     }  
  119.  
  120. }  
  121.  

 

你可能感兴趣的:(职场,ACM,休闲,1088,滑雪)