北大poj-1088

滑雪

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 88484   Accepted: 33177

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

分析:看到这个题感觉好简单,直接递归就写好了,提交居然TLE了。那么就需要一些小技巧了,先干掉动态分配二维数组,然后定义一个二维数组gawDis[]用来记录对应节点的最长路径,后面再用到这个节点的时候就不需要再计算了。综上:递归+记忆化dfs搜索
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define MAXNUM 101
  5
  6 int gawMap[MAXNUM][MAXNUM];
  7 int gawRow;
  8 int gawColumn;
  9 int gawDis[MAXNUM][MAXNUM];
 10
 11 int max(int a, int b)
 12 {
 13     if(a>b)
 14         return a;
 15     else
 16         return b;
 17 }
 18
 19 int Ski(int wlasthigh, int *awlastposition)
 20 {
 21     int awposition[2] = {0};
 22     int wleft = 1;
 23     int wright = 1;
 24     int wup = 1;
 25     int wdown = 1;
 26
 27     if(gawDis[awlastposition[0]][awlastposition[1]] != 0)
 28     {
 29         return gawDis[awlastposition[0]][awlastposition[1]];
 30     }
 31     if(awlastposition[1] > 0)
 32     {
 33         awposition[1] = awlastposition[1]-1;
 34         awposition[0] = awlastposition[0];
 35         if(wlasthigh > gawMap[awposition[0]][awposition[1]])
 36         {
 37             wleft = Ski(gawMap[awposition[0]][awposition[1]], awposition) + 1;
 38         }
 39     }
 40     if(awlastposition[1] < gawColumn-1)
 41     {
 42         awposition[1] = awlastposition[1]+1;
 43         awposition[0] = awlastposition[0];
 44         if(wlasthigh > gawMap[awposition[0]][awposition[1]])
 45         {
 46             wright = Ski(gawMap[awposition[0]][awposition[1]], awposition) + 1;
 47         }
 48     }
 49     if(awlastposition[0] > 0)
 50     {
 51         awposition[0] = awlastposition[0]-1;
 52         awposition[1] = awlastposition[1];
 53         if(wlasthigh > gawMap[awposition[0]][awposition[1]])
 54         {
 55             wup = Ski(gawMap[awposition[0]][awposition[1]], awposition) + 1;
 56         }
 57     }
 58     if(awlastposition[0] < gawRow-1)
 59     {
 60         awposition[0] = awlastposition[0]+1;
 61         awposition[1] = awlastposition[1];
 62         if(wlasthigh > gawMap[awposition[0]][awposition[1]])
 63         {
 64             wdown = Ski(gawMap[awposition[0]][awposition[1]], awposition) + 1;
 65         }
 66     }
 67     wleft = max(wleft, wright);
 68     wup = max(wup, wdown);
 69     return gawDis[awlastposition[0]][awlastposition[1]] = max(wleft, wup);
 70 }
 71
 72 int main(void)
 73 {
 74     int i = 0;
 75     int j = 0;
 76     scanf("%d %d", &gawRow, &gawColumn);
 77
 78     for(i=0; i<gawRow; i++)
 79     {
 80         for(j=0; j<gawColumn; j++)
 81         {
 82             scanf("%d", &gawMap[i][j]);
 83         }
 84     }
 85
 86     int awposition[2] = {0};
 87     for(i=0; i<gawRow; i++)
 88     {
 89         for(j=0; j<gawColumn; j++)
 90         {
 91             awposition[1] = j;
 92             awposition[0] = i;
 93             Ski(gawMap[awposition[0]][awposition[1]], awposition);
 94         }
 95     }
 96
 97     int wLen = 0;
 98     for(i=0; i<gawRow; i++)
 99     {
100         for(j=0; j<gawColumn; j++)
101         {
102             if(wLen < gawDis[i][j]) wLen = gawDis[i][j];
103         }
104     }
105     printf("%d\n", wLen);
106
107     return 0;
108 }
时间: 2024-10-03 21:41:12

北大poj-1088的相关文章

北大POJ题库使用指南

原文地址:北大POJ题库使用指南 北大ACM题分类主流算法: 1.搜索 //回溯 2.DP(动态规划)//记忆化搜索 3.贪心 4.图论 //最短路径.最小生成树.网络流 5.数论 //组合数学(排列组合).递推关系.质因数法 6.计算几何 //凸壳.同等安置矩形的并的面积与周长.凸包计算问题 8.模拟 9.数据结构 //并查集.堆.树形结构 10.博弈论 11.CD有正气法题目分类: 1. 排序 1423, 1694, 1723, 1727, 1763, 1788, 1828, 1838, 1

POJ 1088 滑雪(记忆化搜索)

滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 92384   Accepted: 34948 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17

POJ 1088 滑雪 记忆化优化题解

本题有人写是DP,不过和DP还是有点差别的,应该主要是记忆化 Momoization 算法. 思路就是递归,然后在递归的过程把计算的结果记录起来,以便后面使用. 很经典的搜索题目,这种方法很多题目考到的. 关键还是如何把代码写清晰工整了,O(∩_∩)O~. #include <stdio.h> const int MAX_N = 101; int R, C; int arr[MAX_N][MAX_N]; int tbl[MAX_N][MAX_N]; inline int max(int a,

poj 1088 滑雪

http://poj.org/problem?id=1088 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 int g[200][200]; 7 int dp[200][200]; 8 int r,c; 9 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 10 int max1=-1; 11 12

[ACM] poj 1088 滑雪 (记忆化搜索DFS)

求n*m网格内矩形的数目[ACM] poj 1088 滑雪 (记忆化搜索DFS),布布扣,bubuko.com

poj 1088 滑雪 【记忆化搜索】+【DFS】

策略:如题 题目链接:http://poj.org/problem?id=1088 代码: #include<stdio.h> #include<string.h> int map[105][105], dp[105][105], n, m; const int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; //四个方向 int limit(int x, int y) //判断是不是越界了 { if(x<1||x>n||y<1||

POJ 1088 滑雪 (动规)

滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 75664 Accepted: 28044 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 1

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

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

poj - 1088 - 滑雪(dp)

题意:一个R * C的矩阵(1 <= R,C <= 100),元素代表该点的高度h(0<=h<=10000),从任意点出发,每次只能走上.下.左.右,且将要到的高度要比原高度小,求最长路. 题目链接:http://poj.org/problem?id=1088 -->>设dp[i][j]表示从ij位置出发的最长路,则状态转移方程为: dp[x][y] = max(dp[x][y], Dp(nNewX, nNewY) + 1); 时间复杂度:O(R * C) #inclu

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

题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程:由于由位置[i, j]只能向四个方向移动,所以子问题最多有四个:所以dp[i][j]为其邻域可以滑雪的最大区域长度加上从该位置滑到邻域的长度,即1: 代码如下: #include <cstdio> #include <iostream> #include <algorithm&