题目

滑雪是一道dp及记忆化搜索的经典题目。

所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法。

当下次搜到这里时,便直接使用。

而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效性的话,可能在不同的时候调用这个值所产生的结果并不同。

因此一定要满足无后效性。

且记忆化搜索一定要用深搜,因为如果广搜的话,记忆化搜索就没有什么作用了。(因为广搜一定是先搜到最优结果)

再说滑雪这道题,可以用动态规划来做,当然也可以用记忆化搜索。

可以将dp数组当作记忆化搜索的数组

在记忆化搜索中如果已经搜到这个结果,就记录,当下次搜到这个地方时,看他是否有没有被记录过,如果记录过了,直接使用就好了。

滑雪这个题的意思便是当要其余四个方向的值的高度比要当前的高度大的时候,当前高度便是那四个方向的高度的最大值+1.

最后结果是从所有的点滑雪的最大值。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int dx[]={-,,,};
int dy[]={,-,,};
int map[][];
int dp[][];
int r,c;
int m_search(int x,int y)
{
if(dp[x][y])
return dp[x][y];
int tot=;
for(int i=;i<;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(map[x][y]<map[nx][ny])
{
int tmp=m_search(nx,ny)+;
if(tmp>tot)
tot=tmp;
}
}
dp[x][y]=tot;
return tot;
}
int main()
{
memset(map,,sizeof(map));//一开始调为最小值
scanf("%d%d",&r,&c);
for(int i=;i<=r;i++)
for(int j=;j<=c;j++)
scanf("%d",&map[i][j]);
int ans=;
for(int i=;i<=r;i++)
for(int j=;j<=c;j++)
{
dp[i][j]=m_search(i,j);
ans=max(ans,dp[i][j]);
}
printf("%d\n",ans);
return ;
}

洛谷P1434滑雪题解及记忆化搜索的基本步骤的更多相关文章

  1. 洛谷P1192 台阶问题【记忆化搜索】

    题目:https://www.luogu.org/problemnew/show/P1192 题意: 给定n和k,一个人一次可以迈1~k步,问走n步有多少种方案. 思路: 本来傻乎乎上来就递归,显然会 ...

  2. 洛谷P1040 加分二叉树【记忆化搜索】

    题目链接:https://www.luogu.org/problemnew/show/P1040 题意: 某一个二叉树的中序遍历是1~n,每个节点有一个分数(正整数). 二叉树的分数是左子树分数乘右子 ...

  3. 洛谷3953 (NOIp2017) 逛公园——记忆化搜索+用栈判0环

    题目:https://www.luogu.org/problemnew/show/P3953 因为K只有50,所以想到用dp[ cr ][ j ]表示在点cr.比最短路多走了 j 的方案数.(看了TJ ...

  4. 洛谷 P1141【BFS】+记忆化搜索+染色

    题目链接:https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字 0 与 1 组成的n×n 格迷宫.若你位于一格0上,那么你可以移动到相邻 4 ...

  5. 洛谷P3906 Hoof Paper, Scissor (记忆化搜索)

    这道题问的是石头剪刀布的的出题问题 首先不难看出这是个dp题 其次这道题的状态也很好确定,之前输赢与之后无关,确定三个状态:当前位置,当前手势,当前剩余次数,所以对于剪刀,要么出石头+1分用一次机会, ...

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

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

  7. 洛谷P1434滑雪讲解

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

  8. 洛谷P1434 滑雪

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

  9. 洛谷 - P1434 - 滑雪 - 有向图最长链

    https://www.luogu.org/problemnew/show/P1434 有向图的最长链怎么求?有环肯定不行,这里保证无环.(否则应该使用toposort先求出所有不带环的位置) 设dp ...

随机推荐

  1. WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

    NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient,开源社区创建了另一个名为RestSharp的库.如此多的http库 ...

  2. handsontable 的核心方法

    原文地址:http://blog.csdn.net/mafan121/article/details/46122577 1.为handsontable添加钩子方法 addHook(key,callba ...

  3. vue-area-linkage Vue省市区三级列表联动插件使用

    官方演示地址 // v5及之后的版本 数据依赖于area_data npm i --save vue-area-linkage area-data import Vue from 'vue'; imp ...

  4. 使用Comparable接口自定义排序

    Employee: package textq; /** * 调用接口Comparable排序 * @author Administrator * */ public class Employee i ...

  5. Achievements

    看了Suma,觉得懂了85%以上. 两个月可以学这么多.方法是不懂的就学就行了. 最近学了:字符串,网络流,线段树,斯特林反演,多项式与生成函数,一些数论等.

  6. 295B - Greg and Graph (floyd逆序处理)

    题意:给出任意两点之间的距离,然后逐个删除这些点和与点相连的边,问,在每次删除前的所有点对的最短距离之和 分析:首先想到的是floyd,但是如果从前往后处理,复杂度是(500)^4,超时,我们从后往前 ...

  7. c++入门之再话命名空间的意义

    c++中使用了命名空间这一概念,通过下面这个代码,我们将深刻认识到命名空间的重要作用和意义: # include"iostream" using namespace std; na ...

  8. Django 中的Form、ModelForm

    一.ModelForm 源码 class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass): pass def modelform_fact ...

  9. redis 的使用,及如何使用redis维护数亿人的登录状态

    一.redis中几个常用的方法 redis的使用场景移步本文 select db redis 下默认有有16个表,0~15可以通过:select 2 或者 select 11这样的方式切换表 keys ...

  10. 【学习总结】win7下安装Ubuntu双系统的日常

    参考文献 1 - [双系统中删除linux(win7适用) ] 2 - [win7(32位)U盘安装.卸载ubuntu(64位)双系统] 3 - [Windows下安装Ubuntu 16.04双系统] ...