滑雪
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. 在eclipse中配置Tomcat并将项目部署到Tomcat上

    参考:http://blog.csdn.net/yerenyuan_pku/article/details/51830104 首先在点击window窗口然后preferences 然后点击Add,选择 ...

  2. python_10(模块与包)

    第1章 模块 1.1 模块的种类 1.2 定义 1.3 作用 1.4 导入及使用 1.4.1 import 1.4.2 测试一: 1.4.3 测试二: 1.4.4 测试三: 1.4.5 小结 1.4. ...

  3. enum,sizeof,typedef

    枚举类型的使用方法 enum是C语言中的一种自定义类型 enum值可以根据需要自定义整形值 第一个定义的enum值默认为0 默认情况下的enum值是在前一个定义值得基础上加1 enum类型的变量只能去 ...

  4. 在自己的工程中使用ijkplayer的功能

    最近在做一个软解视频叠加硬解视频的方案,网上看了很多教程,始终不得要领.虽然ijkplayer提供了ijkplayer-example这个示例工程,但对于初入安卓的人来说,要将ijkplayer整合到 ...

  5. 基于 python 的接口测试框架

    项目背景 公司内部的软件采用B/S架构,管理实验室数据,实现数据的存储和分析统计.大部分是数据的增删改查,由于还在开发阶段,所以UI界面的变化非常快,之前尝试过用python+selenium进行UI ...

  6. JVM_Bind问题的解决方案

    心得:删除javaw.exe进程即可. 以下是网络的解决方案: JVM_Bind问题出现通常有两种情况. 一种是原来的javaw.exe没有结束掉而又新创建了一个javaw.exe进程.这本无可厚非, ...

  7. Android Studio -自定义LogCat的颜色

    博文地址 http://www.cnblogs.com/Loonger/p/6285344.html 先看看效果 (设置中的显示,下图) 步骤如下 File->Settings 或Ctrl + ...

  8. SQLite – LIMIT子句

    SQLite - LIMIT子句 SQLite LIMIT子句是用来限制SELECT语句返回的数据量. 语法: SELECT语句.LIMIT子句的基本语法如下: SELECT column1, col ...

  9. Linux之 if命令——简单的shell文件

    如何写一个shell文件,写一个小脚本 1.新建一个脚本文件:vi demo.sh 2.追加执行权限: chmod u+x demo.sh 3.执行脚本:./demo.sh 4.什么是脚本?把一堆命令 ...

  10. v8引擎详解

    引用网址: https://blog.csdn.net/swimming_in_it_/article/details/78869549 前言 JavaScript绝对是最火的编程语言之一,一直具有很 ...