题目链接:##

here we go

题外话:##

谁能想到这是一道咕了两年的\(AC\)呢……当年是在搜索还半懂不懂的时候遇到的这道题,感觉真是难得要命()所以一直拖着不做,后面就下意识地逃避了搜索相关的内容(慢慢变菜

(然后学树形\(dp\)数位\(dp\)的时候强行线性\(dp\)经常推不出被搞疯了)

咳咳,所以终于回来把这道题做了,也算是还债了吧。

有时候感觉自己真是像一头从小被拴在木桩上的象,习惯了之后就从来没想过去挑战一下尝试一下什么的,越来越惰怠,当然只能越来越弱了啊(

题目分析:##

首先这个题是一个很经典的记忆化搜索例题,经典到讲记忆化搜索十个教练有八个都会把这道题搬出来当例题。

所谓记忆化搜索,其本质仍然是递归。但由于递归时有许多重复的状态,所以会耗时巨大,而记忆化搜索以动态规划的方式记录了之前所计算过的状态,下次需要这个状态的时候不需要重新递归计算,而是可以直接拿来用,这样可以节省大量时间。

对于这个题,我们记录搜索到每一个点的最大路径长度,这样下次需要用这个点的时候就不需要再一次递归到头,而是直接调用即可。

顺便,我看题解里有不少判边界的(无限加高的,打判断的),其实可以反过来考虑,把滑雪看成爬坡,每一个\(dfs\)的点只能往高处走,这样递归的判断应该是

    if(Map[x][y]<Map[go_x][go_y]) {
...
}

而\(Map[]\)数组的初始值是\(0\),即边界的\(Map\)值都是\(0\),所以走到边界的时候这个判断语句的返回值永远是\(false\),直接规避了边界问题

对着每一个点\(dfs\)一遍(即把每个点当做终点搜一遍)取最大即可。

代码:##

#include <bits/stdc++.h>
#define N (100+5)
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c;
c = getchar();
while (!isdigit(c)) {
if(c == '-') f = -f;
c = getchar();
}
while (isdigit(c)) {
cnt = cnt * 10 + c - '0';
c = getchar();
}
return cnt * f;
}
int r, c;
int ans=-1;
int mapp[N][N], step[N][N];
const int fx[4] = {0, 1, 0, -1};
const int fy[4] = {1, 0, -1, 0};
int Dfs(int x, int y) {
if(step[x][y]) return step[x][y];
step[x][y] = 1;
for (register int i = 0; i <= 3; i++) {
int gx = x + fx[i]; int gy = y + fy[i];
if(mapp[x][y] < mapp[gx][gy])
step[x][y] = max(step[x][y], Dfs(gx, gy) + 1);
}
return step[x][y];
}
int main() {
r = read();
c = read();
for (register int i = 1; i <= r; i++)
for (register int j = 1; j <= c; j++)
mapp[i][j] = read(); memset(step, 0, sizeof(step));
for (register int i = 1; i <= r; i++)
for (register int j = 1; j <= c; j++)
ans = max(ans, Dfs(i, j)); printf("%d\n", ans);
return 0;
}

[洛谷P1434] [SHOI2007]滑雪的更多相关文章

  1. 洛谷 P1434 [SHOI2002]滑雪

    这道题适合记忆化练手 毕竟总有些大佬虐题. 这个题有几个剪枝 1.记忆化 这个不用多说了吧 剪枝就是 如果 当前点到下面一个点的目前下降的高度+1 小于 下面那个点 能下降的高度 那么反过来,这个点不 ...

  2. 洛谷P1434 [SHOI2002]滑雪

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

  3. 洛谷 P1434 [SHOI2002]滑雪(DP,记忆化搜索)

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

  4. 洛谷 P1434 [SHOI2002]滑雪 解题报告

    这题方法有很多, 这里介绍2种: 方法1 很容易想到搜索, bfs或dfs应该都可以, 就不放代码了: 方法2 这题还可以用 dp 来做. 做法:先将每个点按照高度从小到大排序,因为大的点只能向小的点 ...

  5. 洛谷-P1434 [SHOI2002]滑雪 (记忆化搜索)

    题意:有一个\(R*C\)的矩阵,可以从矩阵中的任意一个数开始,每次都可以向上下左右选一个比当前位置小的数走,求走到\(1\)的最长路径长度. 题解:这题很明显看到就知道是dfs,但是直接爆搜会TLE ...

  6. 洛谷P1434滑雪讲解

    题源:[戳这里] 洛谷博客链接:[戳这里] 我觉得这道题主要方法应该有两种: 动态规划 搜索 下面会分别对这两种方法进行简述 一,动态规划法首先的想法是用L(i,j)表示从点(i,j)出发能到达的最长 ...

  7. BZOJ1935或洛谷2163 [SHOI2007]园丁的烦恼

    BZOJ原题链接 洛谷原题链接 很容易想到二维前缀和. 设\(S[i][j]\)表示矩阵\((0, 0)(i, j)\)内树木的棵数,则询问的矩形为\((x, y)(xx, yy)\)时,答案为\(S ...

  8. 洛谷P1434滑雪题解及记忆化搜索的基本步骤

    题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...

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

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

随机推荐

  1. codeforces 509 B题 Painting Pebbles

    转载地址:http://blog.csdn.net/nike0good/article/details/43449739 B. Painting Pebbles time limit per test ...

  2. Gym - 100676E —— 基础题

    题目链接:https://odzkskevi.qnssl.com/1110bec98ca57b5ce6aec79b210d2849?v=1490453767 题解: 这种方法大概跟离散化扯上点关系:首 ...

  3. html5--3.17 新增的表单重写

    html5--3.17 新增的表单重写 学习要点 对form元素的属性做一个小结,对个别属性进行一点补充 重点掌握新增的表单重写 form元素的属性小结 action/method/enctype/n ...

  4. 【转】C#中使用Redis学习二 在.NET4.5中使用redis hash操作

    摘要 上一篇讲述了安装redis客户端和服务器端,也大体地介绍了一下redis.本篇着重讲解.NET4.0 和 .NET4.5中如何使用redis和C# redis操作哈希表.并且会将封装的一些代码贴 ...

  5. javaScrpit中NaN的秘密

    NaN,不是一个数字,是一种特殊的值来代表不可表示的值,使用typeof或其他任何与之比较的处理方式,‘NaN’则会引起一些混乱, 一些操作会导致NaN值的产生.这里有些例子: Math.sqrt(- ...

  6. OpenCV——PS滤镜 水波效果

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  7. Oracle中CASE WHEN的用法实例

    实例演示: (1)查询表users中的数据. select u.id,u.realname,U.SEX from users u; 查询结果如下 ID    REALNAME SEX 1  10082 ...

  8. docker三剑客之一docker compose

    compose有两个重要的概念: 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker- ...

  9. c语言中的# ## 可变参数宏 ...和_ _VA_ARGS_ _

    1.#假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串.例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字 ...

  10. dom4j的解析实例

    book.xml数据如下: <books> <book> <author>Thomas</author> <title>Java从入门到放弃 ...