记忆化搜索:POJ1088-滑雪(经典的记忆化搜索)
skiing
- 描述
-
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更长。事实上,这是最长的一条。
- 输入
-
第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
后面是下一组数据; - 输出
- 输出最长区域的长度。
- 样例输入
-
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
解题心得:
1、这是一个记忆化搜索,很经典的一个问题,适合记忆化搜索入门。这个题起点不确定,所以要搜索所有的点作为起点,使用记忆化搜索,复杂度并不会爆炸。他每次走比当前点低的地方,一直dfs搜索到终点(走不动的点),然后再记录每一个点是距离终点的第几个点。然后依次返回就行了,思路清晰,并不复杂。
2、记忆化搜索其中重点就在记忆化上面,需要记录什么,如何将当前的搜索和以前搜索过的给联系起来。记忆化搜索优化的部分就是当前搜索和之前的搜索有联系,换句话说就是动态规划,从局部最优达到整体最优。可以脑动模拟一下这个dfs。
#include<stdio.h>
#include<cstring>
const int maxn = 110;
const int Max = 10000000;
int maps[maxn][maxn],dp[maxn][maxn];
int n,m;
int dir[4][2] = {1,0,-1,0,0,1,0,-1}; bool check(int x,int y)
{
if(x<1 || y<1 || x>n ||y>m)
return false;
else
return true;
} void pre_maps()
{
int Min = Max;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
scanf("%d",&maps[i][j]);
if(maps[i][j] < Min)
{
Min = maps[i][j];
}
}
} int dfs(int x,int y)
{
if(dp[x][y])
return dp[x][y];//如果这个地点在之前就已经被找过了可以直接在这个的基础上返回
int ans = 0;
for(int i=0; i<4; i++)
{
if(check(x+dir[i][0],y+dir[i][1]) && maps[x+dir[i][0]][y+dir[i][1]] < maps[x][y])//四个方向符合条件
{
int now;
now = dfs(x+dir[i][0],y+dir[i][1]);
if(now > ans)
ans = now;
}
}
dp[x][y] = ans+1;//逐步返回,步数加一
return dp[x][y];
}
int main()
{
int Max = 0;
scanf("%d%d",&n,&m);
pre_maps();
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
dfs(i,j);
} for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(dp[i][j] > Max)
Max = dp[i][j];//找出滑的最远的那个起点
printf("%d",Max);
return 0;
}
记忆化搜索:POJ1088-滑雪(经典的记忆化搜索)的更多相关文章
- ACM学习历程—POJ1088 滑雪(dp && 记忆化搜索)
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- POJ1088滑雪(dp+记忆化搜索)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 86411 Accepted: 32318 Description ...
- poj1088 滑雪 dp+dfs记忆化
简单的搜索,不必多说了,初始状态下每个点能到达的长度是1,它本身.还有,注意关掉文件重定向,被坑好多次了. 代码如下: #include<cstdio> #include<algor ...
- 洛谷P1434滑雪题解及记忆化搜索的基本步骤
题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...
- POJ1088滑雪
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- 百度站内搜索https不可用切换api搜索,加上谷歌api站内搜索
google推https几年了,百度开始宣传全面https,但是,百度站内搜索 自己的服务却不走https,接口报错.百度分享也是. 然后采用http://search.zhoulujun.cn/cs ...
- Android搜索功能的案例,本地保存搜索历史记录......
开发的APP有一个搜索功能,并且需要显示搜索的历史记录,我闲暇之余帮她开发了这个功能,现把该页面抽取成一个demo分享给大家. 实现效果如图所示: 本案例实现起来很简单,所以可以直接拿来嵌入项目中使 ...
- 分布式搜索ElasticSearch构建集群与简单搜索实例应用
分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...
- 搜索广告与广告网络Demand技术-搜索广告
搜索广告 搜索广告就是一个典型的Ad Network,但是搜索广告非常重要,它的收入非常高,所以它有其独特之处,复杂度也比展示广告要高.它与展示广告在点击率预测,检索部分差不多,它的特点:1. 用户定 ...
随机推荐
- 白话SpringCloud | 第一章:什么是SpringCloud
前言 作为SpringCloud的正式第一章,我们先来简单了解下SpringCloud相关知识点吧,内容可能比较多. 何为微服务 传统单体架构 服务化架构 微服务架构 什么是SpringCloud 核 ...
- 解决gradle下载慢的问题
解决方法要做两部 一 打开用户主目录 linux平台/home/用户名/.gradle windows平台c:\Users\用户名\.gradle macos平台/Users/用户名/.gradle ...
- Django的Serializers的使用
Serializer 在这里通过一个验证用户身份的例子说明rest_framework中serializer.Serialize的使用. 编写serializer Serializer的使用不需要依赖 ...
- 解决移动端浏览器页面 X轴横向滚动条问题
写web端页面的时候,总是会出现横向滚动条,即 X 轴滚动条,导致页面左右滑来滑去. 即使设置了 body,html {overflow-x:hidden;width:100%;} 也无法生效. 解决 ...
- pandas error记录随笔
1.sys:1: DtypeWarning: Columns (0,1) have mixed types. Specify dtype option on import or 解决办法:PANDAS ...
- mybatis 异常处理:Invalid bound statement (not found)
mybatis 的使用过程中提示错误: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): ...
- ubuntu14.04server下安装scala+sbt工具
安装sbt参考https://www.cnblogs.com/wrencai/p/3867898.html 在安装scala时 首先得安装jdk环境,最好安装最新版本以免后续安装出现不必要的麻烦 一. ...
- pat乙级1052
输出“\”字符: cout << "\\"; 因为‘\’是转义字符,例如“\n”代表换行. 同理,printf输出“%”: printf("%%") ...
- git入门使用摘录
无论使用github或者gitlab,第一步都是在本地生产ssh-key,ssh-key作为客户端的身份证存放在user用户的.ssh文件夹下.如果之前没有生产过,需要用ssh-keygen命令生成. ...
- Android(java)学习笔记96:layout_weight使用注意事项
1. android:layout_weight使用说明: layout_weight是权重的意思,也就是各个控件所占的比重,用在LinearLayout布局中.当我们使用layout_weight的 ...