POJ 1088 滑雪(递归+动规)

来源:互联网 发布:第三方身份网络销售 编辑:程序博客网 时间:2024/06/04 22:16
滑雪
Time Limit: 1000MS
Memory Limit: 65536KTotal Submissions: 98203
Accepted: 37290

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
题目大意
从任意一点开始,求一段连续的最长下降子序列,问这段序列最长为多少;解题思路很明显的dp。遍历一下数组,当遍历到某个点时候,搜索它的上下左右四个点是否满足小于当前点,如果满足的话,继续递归下去进行搜索,递归结束后,返回上下左右四个点的最大值。
AC代码
#include <stdio.h>    int matrix[100][100];  int dp[100][100];  int R;  int C;    int Max (int a, int b, int c, int d){      int max1 = (a > b) ? a : b;      int max2 = (c > d) ? c : d;      return (max1 > max2) ? max1 : max2;  }    // dp[i][j] = max(dp[i-1][j], dp[i+1][j], dp[i][j-1], dp[i][j+1]) + 1  int MaxLength(int i, int j){      if (dp[i][j] > 0)          return dp[i][j];      int a = 0;      int b = 0;      int c = 0;      int d = 0;      if (i-1 >= 0 && matrix[i][j] > matrix[i-1][j]){          a = MaxLength (i-1, j);      }      if (i+1 < R && matrix[i][j] > matrix[i+1][j]){          b = MaxLength (i+1, j);      }      if (j-1 >= 0 && matrix[i][j] > matrix[i][j-1]){          c = MaxLength (i, j-1);      }      if (j+1 < C && matrix[i][j] > matrix[i][j+1]){          d = MaxLength (i, j+1);      }      return dp[i][j] = Max (a, b, c, d) + 1;  }    int main(void){      int i, j;      int max;        while (scanf ("%d%d", &R, &C) != EOF){          for (i=0; i<R; ++i)              for (j=0; j<C; ++j){                  scanf ("%d", &matrix[i][j]);                  dp[i][j] = 0;              }          for (i=0; i<R; ++i){              for (j=0; j<C; ++j){                  MaxLength (i, j);              }          }          max = 0;          for (i=0; i<R; ++i){              for (j=0; j<C; ++j){                  if (max < dp[i][j]){                      max = dp[i][j];                  }              }          }          printf ("%d\n", max);      }        return 0;  }  


原创粉丝点击