滑雪
Time Limit: 1000MS                    Memory Limit: 65536k                                  
            http://poj.org/problem?id=1088           

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

Source

看到POJ上有这道题我就笑了,这跟我在南阳oj(NYOJ)上做的”skiing“一样,NYOJ上难度为5,当时用搜索做出来还蛮激动的,因为看到数据范围并不是很大,用搜索应该可以过,答案倒是立马出来了,但毫无疑问-超时,这里时限是1s,只能换一种思路了;

动归是大一寒假集训学的,学长发了一个PPT里面包含了POJ上大部分动归题思路代码详解,来看它所提供的两种思路:

(1)

(2)

思路一和二都是差不多的,它只给出了思路,但代码实现起来可能有点困难,我们可以用结构体将坐标高度存放起来,按高度sort排序,然后从小到大遍历判断周围的点的高度关系,然后再用以上两种思路任何一种都可以求出答案;

下面来看超时搜索代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int a[100][100],maxn;
void dfs(int x,int y,int s,int h,int l)
{
if(x<h&&y<l&&a[x][y]!=0)//判断边界条件,然后往四个方向搜索下去;
{
if(a[x-1][y]>a[x][y])
dfs(x-1,y,s+1,h,l);
if(a[x][y-1]>a[x][y])
dfs(x,y-1,s+1,h,l);
if(a[x+1][y]>a[x][y])
dfs(x+1,y,s+1,h,l);
if(a[x][y+1]>a[x][y])
dfs(x,y+1,s+1,h,l);
maxn=max(maxn,s);
}
}
int main()
{
int hang,lie,i,j;
scanf("%d%d",&hang,&lie);
for(i=0; i<hang; i++)
for(j=0; j<lie; j++)
scanf("%d",&a[i][j]);
maxn=0;
for(i=0; i<hang; i++)
for(j=0; j<lie; j++)
dfs(i,j,1,hang,lie);
printf("%d\n",maxn);
return 0;
}//看起来代码简短易懂,但就是超时了;;

AC代码:

<span style="color:#ff0000;">#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=10000+10;
struct node
{
int x,y,h;//坐标及高度
} a[N];
int cmp(node a,node b)//按高度排序;
{
return a.h<b.h;
}
int d[110][110],dp[110][110];
int main()
{
int hang,lie,i,j,k=0;
scanf("%d%d",&hang,&lie);
for(i=1; i<=hang; i++)
for(j=1; j<=lie; j++)
{
a[++k].x=i,a[k].y=j;
scanf("%d",&d[i][j]);
dp[i][j]=1;
a[k].h=d[i][j];
}
sort(a+1,a+k+1,cmp);
int maxx=0;
for(i=1; i<=k; i++)//这里用的是思路一,人人为我型;
{
if(d[a[i].x][a[i].y]>d[a[i].x+1][a[i].y])判断旁边四个方向的高度关系,然后递推公式如下;
dp[a[i].x][a[i].y]=max(dp[a[i].x][a[i].y],dp[a[i].x+1][a[i].y]+1);
if(d[a[i].x][a[i].y]>d[a[i].x-1][a[i].y])
dp[a[i].x][a[i].y]=max(dp[a[i].x][a[i].y],dp[a[i].x-1][a[i].y]+1);
if(d[a[i].x][a[i].y]>d[a[i].x][a[i].y+1])
dp[a[i].x][a[i].y]=max(dp[a[i].x][a[i].y],dp[a[i].x][a[i].y+1]+1);
if(d[a[i].x][a[i].y]>d[a[i].x][a[i].y-1])
dp[a[i].x][a[i].y]=max(dp[a[i].x][a[i].y],dp[a[i].x][a[i].y-1]+1);
maxx=max(dp[a[i].x][a[i].y],maxx);
}
printf("%d\n",maxx);
return 0;
}</span>

POJ-1088滑雪,典型的动态规划题,与NYOJ-10skiing一样,但NYOJ上时限是3s,用搜索可以过,但在POJ上就超时了~~的更多相关文章

  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 滑雪 -- 动态规划

    题目地址:http://poj.org/problem?id=1088 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  5. POJ 1088 滑雪(模板题 DFS+记忆化)

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

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

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

  7. OpenJudge/Poj 1088 滑雪

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

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

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

  9. POJ 1088 滑雪 DFS 记忆化搜索

    http://poj.org/problem?id=1088 校运会放假继续来水一发^ ^ 不过又要各种复习,功课拉下了许多 QAQ. 还有呀,就是昨天被一个学姐教育了一番,太感谢了,嘻嘻^ ^ 好了 ...

随机推荐

  1. javascript简单的表单验证

    <html> <head> <title>用户登录</title> <script language="javascript" ...

  2. qconshanghai2017

    https://2017.qconshanghai.com/schedule 第一天 (2017/10/17 星期二) 时间 日程 07:45-09:00 签到 上午 主题演讲 软件质量优化与平台创新 ...

  3. return false 的其中一种用法

    return false 的具体是做什么的在这里就不多说了,因为我觉得我形容不明白.....避免大家弄混乱,就不给大家添麻烦了~~ 直接上例子: 1.先看看下面一段代码,指出其中的错误所在: //点击 ...

  4. 开始bootstrap的学习

    终于过完双十一,服务器顶住了压力,不知道为啥,突然的轻松,反而感觉有点无所适从,好久没写博客了,竟然发现还有人回我,很是开心,问题都是关于阿里云的,阿里云的吭确实多,其实关键在于,官方文档还是少,出了 ...

  5. mysql5.7.25集群部署和方案设计(附PXC一键部署脚本)

    还记得我们之前部署mysql集群有多麻烦嘛?波哥来救你们啦!~ 我已将项目上传到了我的github仓库中,大家可以点击仓库地址出现的连接登录查看相应的代码!如果觉得不错别忘了转发.点赞哦! 部署步骤: ...

  6. android xml中使用include标签

    在一个项目中,我们可能会在xml中局部用到相同的布局,如果每次都在xml中重写这些布局,代码显得很冗余.重复的复制黏贴也很烦恼,所以,我们把这些相同的局部布局写成一个单独的xml模块,需要用到这些布局 ...

  7. ubuntu下安装mongo扩展

    安装openssl apt-get install openssl libssl-dev libssl0.9.8 libgtk2.0-dev 安装php-pear apt-get install ph ...

  8. 更新github上的代码

    昨晚熬夜写完了"git上传本地项目代码到github"的任务,早上来公司先把早上的工作完成后,抽点时间继续来继续更新文章 更新github上的代码 一.克隆代码 1.把大神的代码c ...

  9. Database coalesce

    coalesce 语法 注意:连接操作符“||”是一个值得注意的例外. 例如,空值加任何值都是空值,空值 乘任何值也都是空值,依此类推. 参数 expression 任何类型的表达式. n 表示可以指 ...

  10. Animate.css_css3动画库介绍

    插件描述:Animate.css内置了很多典型的css3动画,兼容性好使用方便. Animate.css是一个有趣的,跨浏览器的css3动画库.很值得我们在项目中引用. 用法 1.首先引入animat ...