洛谷OJ P1434 [SHOI2002]滑雪 搜索 递归 记忆化搜索
题目描述
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。下面是 R 行,每行有 C 个数,代表高度(两个数字之间用 1 个空格间隔)。
输出格式
输出区域中最长滑坡的长度。
输入输出样例
输入 #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
输出 #1复制
25
说明/提示
对于 100% 的数据,1≤R,C≤100。
滑雪算得上是一道非常经典的题了。
这个题的思路就是点不多,在每一个点上对四个方向进行搜索,由于重复的路径太多,只需要加个记忆化就好,我们开始从头写一下。
头文件,std命名空间,四个方向写出来:
#include<bits/stdc++.h>
using namespace std;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
定义长r,宽c, 答案ans,存高度的数组a[][],存记忆化路径的数组s[][]。
int r, c, ans, s[101][101], a[101][101];
写搜索:首先记忆化,如果没有走过,这个点自己算一个,然后循环四个方向,四个方向分别进行搜索,递归。
int dfs(int x, int y)
{if(s[x][y]) return s[x][y];s[x][y] = 1;for(int i=0;i<4;i++){int xx=x+dx[i];int yy=y+dy[i];if(xx>0&&yy>0&&xx<=r&&yy<=c&&a[xx][yy]<a[x][y]){dfs(xx, yy);s[x][y] = max(s[x][y], s[xx][yy]+1);}}return s[x][y];
}
主函数,输入r,c,a[][]:
cin >> r >> c;
for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)cin >> a[i][j];
循环每个点,每个点都进行搜索:
for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)ans = max(ans, dfs(i,j));
最后输出即可:
cout << ans;
完整代码:
#include<bits/stdc++.h>
using namespace std;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int r, c, ans, s[101][101], a[101][101];
int dfs(int x, int y)
{if(s[x][y]) return s[x][y];s[x][y] = 1;for(int i=0;i<4;i++){int xx=x+dx[i];int yy=y+dy[i];if(xx>0&&yy>0&&xx<=r&&yy<=c&&a[xx][yy]<a[x][y]){dfs(xx, yy);s[x][y] = max(s[x][y], s[xx][yy]+1);}}return s[x][y];
}
int main()
{cin >> r >> c;for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)cin >> a[i][j];for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)ans = max(ans, dfs(i,j));cout << ans;return 0;
}
洛谷OJ P1434 [SHOI2002]滑雪 搜索 递归 记忆化搜索相关推荐
- 洛谷:P1434 [SHOI2002] 滑雪 题解
题目: P1434 [SHOI2002] 滑雪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本题关键字:记忆化搜索. 首先,这题为什么会想到记忆化?(知道的人直接跳过) 在dfs ...
- 动态规划经典题目——滑雪问题(递归+记忆化搜索)
一.题目 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最 ...
- POJ1088 Bailian1088 滑雪【DFS+记忆化搜索】
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 114685 Accepted: 43807 Description Mic ...
- POJ1088 滑雪 dp入门 记忆化搜索
题意:给你一个r*c的矩阵,只能从图上数字大的地方滑向数字小的地方,问你一次性最多滑过多少个数字. 思路:记忆化搜索.顺序搜索,记录地图上每一个点出发所能达到的最远长度,若某一点标记过说明当前点的最远 ...
- 记忆化搜索例题 记忆化搜索
1.poj 1579 题目链接: http://poj.org/problem?id=1579 代码如下: #include <cstdio> #include <cstring& ...
- 洛谷P1434滑雪(逆向图的遍历搜索递归+记忆化,最长路问题)
题目链接:https://www.luogu.org/problemnew/show/P1434 刚开始最先想到的就是正向递归遍历,遍历所有情况方法,记录找到最长的,正向递归遍历也不难写,但会超时. ...
- 【深度优先搜索】记忆化搜索 P1077 摆花
题意: 深度优先搜索: int dfs(index,cnt)表示选到第index个花,且当前一共选了cnt个 结果为dfs(1,0) index>n+1 return 0 cnt==m ...
- 最大乘积(记忆化搜索)
题目描述 给一段数列,用k个乘号分开,求所得最大值 n<10! 解析 这样就不用写高精啦 枚举第一个乘号的位置递归记忆化搜索即可 问题! 一开始边界条件写了一个这个: if(n-st<k) ...
- UVA10285 Longest Run on a Snowboard【DFS+记忆化搜索】
Michael likes snowboarding. That's not very surprising, since snowboarding is really great. The bad ...
- HDU2089 不要62【数位DP+记忆化搜索】
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
最新文章
- 爬虫核心原理:一次 HTTP 请求到底是如何完成的?
- 从头开始搭建爬虫环境
- sonar:默认的扫描规则
- TCP/IP详解学习笔记(1)
- C4D素材背景模板|广泛应用电商场景和展览的运用
- 在自定义HttpHandler中使用Session
- 标识符的作用域与可见性
- 传入一个月份获取该月的统计信息
- 进程之基础知识(一)
- Oracle P6培训系列:02登录
- 【操作系统⑩】——进程死锁【银行家算法+详细样例 进程死锁的预防机制、避免机制、检测与解决】
- 流氓软件驱动精灵 强制锁定浏览器主页
- vue项目html5调取手机摄像头录像并上传
- SAP GUI登陆系统报Validity of certificate from list with PSE type >SSL错误弹窗
- oracle 考试结果哪里查,oracle认证考试成绩查询的方法是怎样的?
- 过了所有技术面,却倒在 HR 一个问题上
- 轻松实现iMessage群发
- app软件开发有哪些方式?
- Make your own Neural NetWork之代码详解中
- eterm和easyfare的官网地址