滑雪滑雪滑雪

ssl 1202

luogu 1434

pku 1088

题目大意:

有一个N*M的矩阵,每个位置都有一个数,可以从大的数走向小的数,问可走的路最长是多少


原题

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更长。事实上,这是最长的一条(如下)。

Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

Output

输出最长区域的长度。

Sample Input

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

Sample Output

25


方法一

用递归的方法,从每一个位置开始都试一遍,就可以TLE了,一定要用记忆化搜索!保存每一位的最优值,速度会快很多,就AC了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,a[505][505],f[505][505],sum;
const int dx[4]={1,0,-1,0};
const int dy[4]={0,1,0,-1};
int js(int x,int y)
{if (f[x][y]) return f[x][y];//记忆化f[x][y]=1;//自身for (int k=0;k<4;k++)if ((x+dx[k]>0)&&(x+dx[k]<=n)&&(y+dy[k]>0)&&(y+dy[k]<=m)&&(a[x][y]>a[x+dx[k]][y+dy[k]]))//判断有没有出界和是否能走f[x][y]=max(f[x][y],js(x+dx[k],y+dy[k])+1);//走的话就是它加一,不走就是原数,求maxreturn f[x][y];
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)scanf("%d",&a[i][j]);//输入for (int i=1;i<=n;i++)//尝试从每一个位置开始for (int j=1;j<=m;j++)sum=max(sum,js(i,j));//求最大的printf("%d",sum);//输出return 0;
}

方法二

用线性DP的方法,先把每一位用一个数组a存起来,在按高度从小到大排序,从小到大每一次都判断是否能往四周走,能就是下一步+1,求max,用f[i][j]记从i,j开始的最长长度,

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int dx[4]={1,0,-1,0};
const int dy[4]={0,1,0,-1};
int n,m,t,ans,f[505][505],b[505][505],x1,x2,y1,y2;
struct rec
{int x,y,h;
}a[250005];//结构体
bool cmp(rec ai,rec bi)//排序
{return ai.h<bi.h;//按高度从小到大排序
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){t++;scanf("%d",&b[i][j]);a[t].x=i;//存行a[t].y=j;//存列a[t].h=b[i][j];//存高度f[i][j]=1;//自己的长度}sort(a+1,a+1+t,cmp);//排序for (int i=1;i<=t;i++)//从小到大排序(无后效性){x1=a[i].x;//行y1=a[i].y;//列for (int k=0;k<4;k++){x2=x1+dx[k];//进一步的行y2=y1+dy[k];//进一步的列if ((x2>0)&&(x2<=n)&&(y2>0)&&(y2<=m)&&(b[x1][y1]>b[x2][y2]))//判断有没有出界和是否能走f[x1][y1]=max(f[x1][y1],f[x2][y2]+1);//求最大的}ans=max(f[x1][y1],ans);//结果最大的}printf("%d",ans);return 0;
}

【记忆化搜索】【线性化DP】滑雪 (ssl 1202/luogu 1434/pku 1088)相关推荐

  1. 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof

    题目传送门 1 /* 2 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 3 ans = min (ans, max (dp[x][y-i], dp[x-1][i ...

  2. BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp

    题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  3. 【POJ - 1661】Help Jimmy(记忆化搜索,dp)

    题干: Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开 ...

  4. jzoj6451-[2020.01.19NOIP提高组]不幸运数字【记忆化搜索,数位dp,高精度】

    正题 题目链接:https://jzoj.net/senior/#main/show/6451 题目大意 给出a,ba,ba,b,求[a,b][a,b][a,b]这个区间中有多少数字包含444. 解题 ...

  5. 【DP】【记忆化搜索】NIKOLA(jzoj 1150)

    NIKOLA 题目大意: NIKOLA画了一排数字,他一开始在1,他可以往前跳T+1格(T为上一次跳到此格跳的格数),或往后T格(T一开始为0),但不能跳出界,没跳到一个格子,就要加上此格子的值(一开 ...

  6. UVA 1220 Party at Hali-Bula (树状DP+记忆化搜索)

    Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement from ...

  7. 动态规划入门——记忆化搜索

    文章目录 记忆化搜索 1.数塔问题 2.滑雪 总结 记忆化搜索 1.数塔问题 [动规:递归求解] 递推方程: 不难发现,最后一层的点到最后一层的最大距离即为自己对应的值a[n - 1][y],这个就是 ...

  8. 棋盘分割(记忆化搜索)

    棋盘分割 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. [蓝桥杯][2014年第五届真题]地宫取宝(记忆化搜索)

    题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

最新文章

  1. legend3---lavarel安装debugbar工具条
  2. sqlplus执行mysql_在SQLPLUS启动和停止Oracle数据库
  3. linux epoll 模型详解
  4. 九、Golang并发和线程模型
  5. 学习vi和vim编辑器(1):vi文本编辑器
  6. C++新特性探究(十二):static_assert(提前判误)
  7. 谈360下拉词360下拉框的优势及360搜索推广方法有哪些?
  8. Java 创建xml文件和操作xml数据
  9. 护理教育学考试复习题
  10. 【无人机系统】四轴飞行器及其UAV飞控系统 - 桂林电子科技大学信息科技学院 电子工程系(一)
  11. 【软件工程】根据数据流图导出程序结构
  12. ubuntu/deepin安装配置mysql
  13. 职场中哪些职场很重要?
  14. AI 工程师职业指南
  15. ubuntu安装企业微信
  16. 完全认识计算机网络之TCP/IP
  17. aliases节点分析
  18. linux怎么查看系统环境变量路径,Linux系统中的环境变量该如何设置与查看
  19. 数据结构与算法(1)--二叉树
  20. 读取Excel数据到集合中

热门文章

  1. 电脑任务管理器快捷键_电脑知识小常识
  2. 服务器不知道怎么回事安卓系统很卡,为什么安卓系统很容易变卡?该怎么解决?看完长知识了...
  3. win10 mysql my.cnf_MySQL配置文件无法修改的解决方法(Win10)
  4. b+树时间复杂度_第15期:索引设计(索引组织方式 B+ 树)
  5. leetcode115. 不同的子序列
  6. MVC三层架构(详解)
  7. Java StringBuffer 方法
  8. [C++11]函数模板的默认模板参数
  9. 并发协作模型“生产者/消费者模式“
  10. linux aspnet服务器,在Linux中安装ASPNET.Core3.0运行时的示例代码