题目描述

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-124-17-16-124-17-16-1(从242424开始,在111结束)。当然25-24-23-...-3-2-125-24-23-...-3-2-125-24-23-...-3-2-1更长。事实上,这是最长的一条。

输入输出格式

输入格式:

输入的第一行为表示区域的二维数组的行数RRR和列数CCC(1≤R1≤R1≤R,C≤100C≤100C≤100)。下面是RRR行,每行有CCC个数,代表高度(两个数字之间用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

思路

可以轻易地推出状态转移方程为:

dp[i][j]=max(dp[i−1][j]+1,dp[i][j]  (if dp[i][j]>dp[i−1][j])
dp[i][j]=max(dp[i-1][j]+1,dp[i][j]\ \ (if\ dp[i][j]>dp[i-1][j])
dp[i][j]=max(dp[i−1][j]+1,dp[i][j]  (if dp[i][j]>dp[i−1][j])

dp[i][j]=max(dp[i+1][j]+1,dp[i][j]  (if dp[i][j]>dp[i+1][j])
dp[i][j]=max(dp[i+1][j]+1,dp[i][j]\ \ (if\ dp[i][j]>dp[i+1][j])
dp[i][j]=max(dp[i+1][j]+1,dp[i][j]  (if dp[i][j]>dp[i+1][j])

dp[i][j]=max(dp[i][j−1]+1,dp[i][j]  (if dp[i][j]>dp[i][j−1])
dp[i][j]=max(dp[i][j-1]+1,dp[i][j]\ \ (if\ dp[i][j]>dp[i][j-1])
dp[i][j]=max(dp[i][j−1]+1,dp[i][j]  (if dp[i][j]>dp[i][j−1])

dp[i][j]=max(dp[i][j+1]+1,dp[i][j]  (if dp[i][j]>dp[i][j+1])
dp[i][j]=max(dp[i][j+1]+1,dp[i][j]\ \ (if\ dp[i][j]>dp[i][j+1])
dp[i][j]=max(dp[i][j+1]+1,dp[i][j]  (if dp[i][j]>dp[i][j+1])

但是dp[i−1][j],dp[i+1][j],dp[i][j−1],dp[i][j+1]dp[i-1][j],dp[i+1][j],dp[i][j-1],dp[i][j+1]dp[i−1][j],dp[i+1][j],dp[i][j−1],dp[i][j+1]的值不能通过普通的线性dp来求的,所以需要进行记忆化搜索来遍历所有的状态,并进行记忆化,这样就可以获得上述四个状态的值了,然后进行dp即可

也可以将二维的地图进行降维,然后进行线性dp,具体方法请看dalao博客:https://sparky.blog.luogu.org/solution-p1434

AC代码

/*************************************************************************

	 > Author: WZY
> School: HPU
> Created Time: 2019-02-06 20:45:27 ************************************************************************/
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
#define INF 0x7f7f7f7f
const int maxn=1e3+10;
const int mod=1e9+7;
using namespace std;
int a[maxn][maxn];
int dp[maxn][maxn];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,m;
int dfs(int x,int y)
{
if(dp[x][y])
return dp[x][y];
int _=0;
for(int i=0;i<4;i++)
{
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(dx<=n&&dx>0&&dy<=m&&dy>0&&a[x][y]>a[dx][dy])
_=max(dfs(dx,dy)+1,_);
}
dp[x][y]=max(_,dp[x][y]);
return dp[x][y];
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
ms(dp,0);
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans=max(ans,dfs(i,j));
cout<<ans+1<<endl;
return 0;
}

洛谷 P1434 [SHOI2002]滑雪(DP,记忆化搜索)的更多相关文章

  1. 【洛谷1434 [SHOI2002]滑雪】记忆化搜索

    AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) memset(a,b,sizeof(a)) typed ...

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

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

  3. 洛谷P1434 [SHOI2002]滑雪

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

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

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

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

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

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

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

  7. 洛谷 P1434 [SHOI2002]滑雪

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

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

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

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

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

随机推荐

  1. 『学了就忘』Linux文件系统管理 — 63、磁盘配额介绍

    目录 1.磁盘配额概念 2.磁盘配额条件 3.磁盘配额的相关概念 4.磁盘配额实践规划 1.磁盘配额概念 磁盘配额是限制用户或者用户组在一个分区上可以使用的空间大小和文件个数的限制. 扩展: 管理员可 ...

  2. CSS3单行文本两端对齐

    CSS3实现单行文本两端对齐 p { height: 24px; text-align: justify; text-last-align: justify; } p::after { display ...

  3. js获取中国省市区,省市筛选、省市、省市筛选联动。【C#】【js】

    <style type="text/css"> .labelhide { -webkit-box-shadow: 0px 1px 0px 0px #f3f3f3 !im ...

  4. day06 python代码操作MySQL

    day06 python代码操作MySQL 今日内容 python代码操作MySQL 基于python与MySQL实现用户注册登录 python操作MySQL python 胶水语言.调包侠(贬义词& ...

  5. day02 Rsyuc备份服务器

    day02 Rsyuc备份服务器 一.备份 1.什么是备份 备份就是把重要的数据或者文件复制一份保存到另一个地方,实现不同主机之间的数据同步 一般数据比较重要的情况下,数据如果丢失很容易找不回来了的, ...

  6. Flink(二)【架构原理,组件,提交流程】

    目录 一.运行架构 1.架构 2.组件 二.核心概念 TaskManager . Slots Parallelism(并行度) Task .Subtask Operator Chains(任务链) E ...

  7. 零基础学习java------36---------xml,MyBatis,入门程序,CURD练习(#{}和${}区别,模糊查询,添加本地约束文件) 全局配置文件中常用属性 动态Sql(掌握)

    一. xml  1. 文档的声明 2. 文档的约束,规定了当前文件中有的标签(属性),并且规定了标签层级关系 其叫html文档而言,语法要求更严格,标签成对出现(不是的话会报错) 3. 作用:数据格式 ...

  8. nodejs-os模块

    JavaScript 标准参考教程(alpha) 草稿二:Node.js os模块 GitHub TOP os模块 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 ...

  9. 手淘lib-flexible布局适配方案

    前置知识:什么是rem CSS3新增的一个相对单位rem(root em,根em).rem是相对于根节点(或者是html节点).如果根节点设置了font-size:10px;那么font-size:1 ...

  10. MyBatis Collection小记—— 关联查询、递归查询、多字段关联

    经常会用到mybatis的Collection标签来做级联查询或递归查询,现通过一个伪例来简单的说明一下使用中的关键点: 首先先列出三个表,给出一个场景: 1,角色表 t_role( id,name ...