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

Description

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

  1. 1 2 3 4 5
  2.  
  3. 16 17 18 19 6
  4.  
  5. 15 24 25 20 7
  6.  
  7. 14 23 22 21 8
  8.  
  9. 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

  1. 5 5
  2. 1 2 3 4 5
  3. 16 17 18 19 6
  4. 15 24 25 20 7
  5. 14 23 22 21 8
  6. 13 12 11 10 9

Sample Output

  1. 25

  1. #include <stdio.h>
  2.  
  3. int matrix[100][100];
  4. int dp[100][100];
  5. int R;
  6. int C;
  7.  
  8. int Max (int a, int b, int c, int d){
  9. int max1 = (a > b) ? a : b;
  10. int max2 = (c > d) ? c : d;
  11. return (max1 > max2) ? max1 : max2;
  12. }
  13.  
  14. // dp[i][j] = max(dp[i-1][j], dp[i+1][j], dp[i][j-1], dp[i][j+1]) + 1
  15. int MaxLength(int i, int j){
  16. if (dp[i][j] > 0)
  17. return dp[i][j];
  18. int a = 0;
  19. int b = 0;
  20. int c = 0;
  21. int d = 0;
  22. if (i-1 >= 0 && matrix[i][j] > matrix[i-1][j]){
  23. a = MaxLength (i-1, j);
  24. }
  25. if (i+1 < R && matrix[i][j] > matrix[i+1][j]){
  26. b = MaxLength (i+1, j);
  27. }
  28. if (j-1 >= 0 && matrix[i][j] > matrix[i][j-1]){
  29. c = MaxLength (i, j-1);
  30. }
  31. if (j+1 < C && matrix[i][j] > matrix[i][j+1]){
  32. d = MaxLength (i, j+1);
  33. }
  34. return dp[i][j] = Max (a, b, c, d) + 1;
  35. }
  36.  
  37. int main(void){
  38. int i, j;
  39. int max;
  40.  
  41. while (scanf ("%d%d", &R, &C) != EOF){
  42. for (i=0; i<R; ++i)
  43. for (j=0; j<C; ++j){
  44. scanf ("%d", &matrix[i][j]);
  45. dp[i][j] = 0;
  46. }
  47. for (i=0; i<R; ++i){
  48. for (j=0; j<C; ++j){
  49. MaxLength (i, j);
  50. }
  51. }
  52. max = 0;
  53. for (i=0; i<R; ++i){
  54. for (j=0; j<C; ++j){
  55. if (max < dp[i][j]){
  56. max = dp[i][j];
  57. }
  58. }
  59. }
  60. printf ("%d\n", max);
  61. }
  62.  
  63. return 0;
  64. }

POJ 1088 滑雪 -- 动态规划的更多相关文章

  1. POJ 1088 滑雪(记忆化搜索+dp)

    POJ 1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 107319   Accepted: 40893 De ...

  2. POJ 1088 滑雪(记忆化搜索)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 92384   Accepted: 34948 Description ...

  3. POJ 1088 滑雪 【记忆化搜索经典】

    题目链接:http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:  ...

  4. POJ 1088 滑雪 ( DFS+动态规划思想 )

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 79519   Accepted: 29581 Description ...

  5. OpenJudge/Poj 1088 滑雪

    1.链接地址: bailian.openjudge.cn/practice/1088 http://poj.org/problem?id=1088 2.题目: 总Time Limit: 1000ms ...

  6. poj 1088 滑雪(区间dp+记忆化搜索)

    题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...

  7. POJ 1088 滑雪 记忆化DP

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K       Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度 ...

  8. POJ 1088 滑雪 (记忆化搜索)

    题目链接:http://poj.org/problem?id=1088 题意很好懂,就是让你求一个最长下降路线的长度. dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j ...

  9. poj 1088 滑雪 DP(dfs的记忆化搜索)

    题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 ...

随机推荐

  1. Riesz-Thorin插值不等式

  2. eclispe搭建android平台

    1.不推荐在线安装android ADT,因为需要FQ.可以在网上下载ADT,然后离线安装. 离线安装方式:help->Install ->点击add然后选择你的安装包(不需要解压),一直 ...

  3. Java获取时间与系统时间相差8小时终极解决方案

    一.在取日期以前设置一下时区 TimeZone tz = TimeZone.getTimeZone(“ETC/GMT-8″);TimeZone.setDefault(tz); 此种方法适用于单次快速获 ...

  4. 【转】rvm安装ruby,gem,rails,之后仍然无法找到rails命令

    转自:http://chinacheng.iteye.com/blog/1738036 rvm安装ruby和rails之后,ruby -v好使,gem -v好使.但是rails -v不好使,提示没有安 ...

  5. POJ 2778 DNA Sequence (AC自己主动机 + dp)

    DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...

  6. .NET分布式事务处理总结【下】 - 包含MSMQ的分布式事务处理

    转自:http://www.cnblogs.com/daxnet/archive/2011/03/15/1984995.html .NET直接提供对MSMQ的访问支持,只需要添加System.Mess ...

  7. js用斜率判断鼠标进入div的四个方向

    网上大部分判断鼠标移入div移入移出都是使用一下方法: 这个方法确实十分奇特,使用起来十分方便. 后来自己看了一些文章,看到有另一种以斜率的方法来判断鼠标的移动方向. 上图是此方法的示意图,以浏览器左 ...

  8. 使用GDB调试Android NDK native(C/C++)程序

    使用GDB调试Android NDK native(C/C++)程序 先说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口 ...

  9. 学习opencv中文版教程——第二章

    学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...

  10. Visual Studio dte 获取代码方法注释