记忆化搜索入门题

题目

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(从24开始,在1结束)。

当然25-24-23―┅―3―2―1更长。事实上,这是最长的一条。

输入输出格式

输入格式:

输入的第一行为表示区域的二维数组的行数R和列数C(1≤R,C≤100)。

下面是R行,每行有C个数,代表高度(两个数字之间用1个空格间隔)。

输出格式:

输出区域中最长滑坡的长度

输入输出样例

输入样例

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

输出样例

25

题解

分析

记忆化搜索

记忆化搜索本质上是搜索的一种

但它保证了,每一层回溯得到的结果都具有子最优性质

所以又具有了动态规划的特征

(i,j) 为当前所在的坐标

  • 条件:由高处滑向低处$h[i][j]>h[p][q]$
  • 转移:$dp[i][j]=max(up,down,left,right)+1$

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define re register int
using namespace std;
const int max_size=110;
int n,m;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int h[max_size][max_size],dp[max_size][max_size];
int inMap(int x,int y){
if(x>=0&&x<=n-1&&y>=0&&y<=m-1) return 1;
return 0;
}
int max2(int a,int b,int c,int d){
return max(max(a,b),max(c,d));
}
int dfs(int i,int j){
int nx,ny,down=0,up=0,left=0,right=0;
if(dp[i][j]) return dp[i][j];
nx=i+dir[0][0]; ny=j+dir[0][1];
if(inMap(nx,ny)){
if(h[i][j]>h[nx][ny]) up=dfs(nx,ny);
}
nx=i+dir[1][0]; ny=j+dir[1][1];
if(inMap(nx,ny)){
if(h[i][j]>h[nx][ny]) right=dfs(nx,ny);
}
nx=i+dir[2][0]; ny=j+dir[2][1];
if(inMap(nx,ny)){
if(h[i][j]>h[nx][ny]) down=dfs(nx,ny);
}
nx=i+dir[3][0]; ny=j+dir[3][1];
if(inMap(nx,ny)){
if(h[i][j]>h[nx][ny]) left=dfs(nx,ny);
}
dp[i][j]=max2(up,down,left,right)+1;
return dp[i][j];
}
int main(){
scanf("%d%d",&n,&m);
memset(h,0,sizeof(h));
memset(dp,0,sizeof(dp));
for(re i=0;i<n;i++){
for(re j=0;j<m;j++){
scanf("%d",&h[i][j]);
}
}
int ans=-1;
for(re i=0;i<n;i++){
for(re j=0;j<m;j++){
ans=max(ans,dfs(i,j));
}
}
printf("%d\n",ans);
}

【题解】滑雪 luogu1434 记忆化搜索的更多相关文章

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

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

  2. 滑雪_poj_1088(记忆化搜索).java

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 67987   Accepted: 25013 Description ...

  3. 洛谷 p1434 滑雪【记忆化搜索】

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

  4. POJ-1088 滑雪 (记忆化搜索,dp)

    滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 86318 Accepted: 32289 Description Mich ...

  5. POJ 1088 滑雪【记忆化搜索】

    题意:给出一个二维矩阵,要求从其中的一点出发,并且当前点的值总是比下一点的值大,求最长路径 记忆化搜索,首先将d数组初始化为0,该点能够到达的路径长度保存在d数组中,同时把因为路径是非负的,所以如果已 ...

  6. poj 1088 滑雪_记忆化搜索

    题意:略 直接用记忆化搜索就行了 #include<cstdio> #include<iostream> using namespace std; int n,m; int m ...

  7. POJ1088滑雪(记忆化搜索)

    就是用DP,DP[i][j]是在这个(i,j)位置作为起点的最长长度. 因为可能会超时,DP的话每次就是记录,然后就不用回溯了. 很简单的DFS里面的记忆化搜索. #include <stdio ...

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

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

  9. OpenJ_Bailian - 1088 滑雪(记忆化搜索)

    题意:给定一个二维数组,一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小,输出可以滑行的最长区域的长度. 分析:对于每一个点,进行记忆化搜索.若某点可以向四周某几个点滑行,记忆化搜索求出 ...

随机推荐

  1. CRM系统推动教育行业数字化转型

    目前,教育培训的潜在市场规模巨大,并且保持着迅猛的发展态势.同时,随着众多外资企业不断涌入中国市场,与国内大大小小的培训机构展开竞争,所以教育行业的竞争也是非常的激烈.传统的教育行业亟待数字化转型,才 ...

  2. MSSQL·查询存储过程中的关键字

    阅文时长 | 0.22分钟 字数统计 | 408字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·查询存储过程中的关键字』 编写人 | SCscHero 编写时间 | 20 ...

  3. LVS跨网段DR模型

    客户端IP地址:172.16.8.147 路由器服务器IP地址:172.16.8.167内网IP地址:192.168.1.3 一.将客户端的网关修改为路由服务器IP地址 vim ifcfg-ens33 ...

  4. java基础——多维数组和稀疏数组

    多维数组 多维数组可以堪称数组的数组,比如二维数组就是一个特殊的一维数组,其中每一个元素都是一个以为数组 而且数组 int a[][]= new int[2][3]; public class Arr ...

  5. [Java] 数据分析 -- 回归分析

    线性回归 需求:从文件读取数据对,计算回归函数及系数 实现1:commons.math的SimpleRegression,定义函数getData从文件读取数据返回SimpleRegression类 1 ...

  6. 查询登录信息 w, who*, id, tty, last, finger

    查询登录信息 w, who*, id, tty, last, finger Wavky2016.12.14 16:19:37字数 813阅读 85w [options] [user...]显示所有已登 ...

  7. Linux 操作系统(三) 添加用户、切换用户、删除用户

    以下命令均已在 Kali Linux 验证. 1.添加用户 --1-- useradd -m username            //username 代表你所添加的用户名 --2-- passw ...

  8. 最简单的方法是使用标准的 Linux GUI 程序之一: i-nex 收集硬件信息,并且类似于 Windows 下流行的 CPU-Z 的显示。 HardInfo 显示硬件具体信息,甚至包括一组八个的流行的性能基准程序,你可以用它们评估你的系统性能。 KInfoCenter 和 Lshw 也能够显示硬件的详细信息,并且可以从许多软件仓库中获取。

    最简单的方法是使用标准的 Linux GUI 程序之一: i-nex 收集硬件信息,并且类似于 Windows 下流行的 CPU-Z 的显示. HardInfo 显示硬件具体信息,甚至包括一组八个的流 ...

  9. 用PHP爬取知乎的100万用户

    http://blog.jobbole.com/88788/ 突然发现 大数据 Python的爬虫能力很强 爬取到的数据 直接可以用于维修QQ营销 精准营销

  10. 2.9高级变量类型操作(列表 * 元组 * 字典 * 字符串)_内置函数_切片_运算符_for循环

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) ...