快速链接

  • 原题链接
  • 题目大意
  • 输入格式
  • 输出格式
  • 数据范围
  • 解题思路
  • 上代码

原题链接

P1434
题目类型:普及+/提高{\color{yellow}{普及+/提高}}普及+/提高
AC记录:

1.Accepted
2.Accepted

题目大意

给你一个n×mn\times mn×m的矩阵aaa,ai,ja_{i,j}ai,j​代表(i,j)(i,j)(i,j)这个地方的高度,你可以从任意一个地方出发,然后走到一个和这个地方四联通并且高度严格小于当前位置高度地方,求你可以走的最长路线长度。

输入格式

输入的第一行为表示区域的二维数组的行数nnn和列数mmm。下面是nnn行,每行有mmm个数,代表高度(两个数字之间用111个空格间隔)。

输出格式

输出区域中你可以走的最长路线长度。
Sample\mathbf{Sample}Sample Input\mathbf{Input}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\mathbf{Sample}Sample Output\mathbf{Output}Output

25

Hint&Explain\mathbf{Hint\&Explain}Hint&Explain
直接从(3,3)(3,3)(3,3)开始然后螺旋走,途径高度为25-24-23-22-21-...-3-2-1

数据范围

对于100%100\%100%的数据,1≤n,m≤1001\le n,m\le 1001≤n,m≤100。

解题思路

这题可以用两种方法来做。


记忆化搜索
如果直接使用搜索,按照四联通的方法走的话,绝对会超时。因此我们要使用记搜
在每一次经过一个位置的时候,记录一个fff数组,表示当前最长的滑雪路径长度,这样每一个位置最多只用执行一次操作,大大减少了原来的时间复杂度。
核心代码:

int dfs(int x,int y)
{if(f[x][y])return f[x][y];f[x][y]=1;for(int i=1; i<=4; i++){int xx=x+dx[i],yy=y+dy[i];if(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]<a[x][y])f[x][y]=max(f[x][y],dfs(xx,yy)+1);}return f[x][y];
}

注意事项

1.在判断方向时,一定要注意不要走错方向!这里给出一个记忆方法:
对于四联通来说,只要xxx坐标加一减一,yyy坐标也加一减一就可以了

int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};

对于八连通来说,只要xxx坐标三个连续的-1和三个连续的0和三个连续的1,yyy坐标连续三个-1,0,1就可以了。这里把(0,0)提前了。

int dx[9]={0,-1,-1,-1,0,0,1,1,1};
int dy[9]={0,-1,0,1,-1,1,-1,0,1};

dpdpdp做法
由于滑雪的路程是从高到低,所以只要你到达了一个点,就不会返回你来的那个点,满足dpdpdp的无后效性,所以本题可以用dpdpdp解决。
既然要满足无后效性,那么我们肯定要对整个地图进行排序,记录之前的位置和高度,在按照高度从大到小排序。作者这里用到的是STL里面的priority_queue,如果用了priority_queue,记得要重载()运算符!
排完序后,就可以进行dpdpdp了。枚举每一个高度,搜索比他小的四联通的高度,由于我们先前已经排好序了,所以会快很多。枚举到一个与他相邻的格子,就要注意进行状态转移了,直接在当前长度上加一即可。
但是最后的答案是max⁡1≤i≤n×mfi\max_{1\le i\le n\times m}f_imax1≤i≤n×m​fi​!
如果说按照最高的高度可以到达更多个点的话,那么下面这个数据点就过不了:

5 5
2 3 4 5 6
17 1 1 1 7
16 1 25 1 8
15 1 1 1 9
14 13 12 11 10

在这个数据点中,f25f_{25}f25​的值为2,而标准答案是16
所以说要取fff数组里面所有数的最大值。

注意事项:

1.使用priority_queue时要加上头文件#include<queue>,这里的使用方法为priority_queue<obj,vector<obj>,cmp> pq;其中的cmp为单独的一个用来储存()重载的结构体。
2.也是一样,在判断方向的时候一定不要算错!


最后,祝大家早日

上代码

dfsdfsdfs算法

#include<iostream>using namespace std;int        n,m;
int        a[1010][1010];
int        f[1010][1010];
int        dx[5]={0,0,0,-1,1};
int        dy[5]={0,-1,1,0,0};int dfs(int x,int y)
{if(f[x][y])return f[x][y];f[x][y]=1;for(int i=1; i<=4; i++){int xx=x+dx[i],yy=y+dy[i];if(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]<a[x][y])f[x][y]=max(f[x][y],dfs(xx,yy)+1);}return f[x][y];
}int main()
{cin>>n>>m;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)cin>>a[i][j];int sum=0;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)sum=max(sum,dfs(i,j));// for(int i=1; i<=n; i++)// {//     for(int j=1; j<=m; j++)//         cout<<f[i][j]<<" ";//     cout<<endl;// }cout<<sum<<endl;return 0;
}

dpdpdp算法

#include<iostream>
#include<cstring>
#include<queue>using namespace std;struct obj{obj(int a=0,int b=0,int c=0):x(a),y(b),val(c){}int x,y,val;
};struct cmp{inline bool operator()(obj,obj);
};inline bool cmp::operator()(obj x,obj y)
{return x.val>y.val;
}priority_queue<obj,vector<obj>,cmp>     pq;
int                                     n,m,tar;
int                                     dx[5]={0,0,0,-1,1};
int                                     dy[5]={0,-1,1,0,0};
int                                     a[110][110];
int                                     f[110][110];int main()
{cin>>n>>m;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)cin>>a[i][j],pq.push(obj(i,j,a[i][j]));memset(f,-0x7f7f7f7f,sizeof(f));while(pq.size()){obj now=pq.top();pq.pop();int x=now.x,y=now.y,val=now.val;f[x][y]=1;for(int i=1; i<=4; i++){int xx=x+dx[i],yy=y+dy[i];if(xx>0&&xx<=n&&yy>0&&yy<=n&&a[xx][yy]<a[x][y])f[x][y]=max(f[x][y],f[xx][yy]+1);}tar=max(tar,f[x][y]);}cout<<tar<<endl;return 0;
}

完美切题∼\sim∼

P1434 [SHOI2002]滑雪相关推荐

  1. [P1434 [SHOI2002]滑雪](DFS,记忆化搜索)

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

  2. 洛谷:P1434 [SHOI2002] 滑雪 题解

    题目: P1434 [SHOI2002] 滑雪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本题关键字:记忆化搜索. 首先,这题为什么会想到记忆化?(知道的人直接跳过) 在dfs ...

  3. 洛谷—P1434 [SHOI2002]滑雪题解

    题目链接: P1434 [SHOI2002]滑雪 解题思路: 在这道题中dfs每种情况是,可能这个点之前已经搜过了,没必要再去搜索了,因此不如存储记住,就没必要再去dfs了.所以我们要记忆化搜索解决这 ...

  4. [洛谷]P1434 [SHOI2002] 滑雪

    P1434 [SHOI2002] 滑雪 1.题目 2.分析 3.代码 1.map + dp 70 原因分析:当key相同时,map会覆盖掉先前的值!! 2.优先队列priority_queue + d ...

  5. 洛谷 P1434 [SHOI2002] 滑雪(优先队列+dp / 记忆化搜索)

    P1434 [SHOI2002] 滑雪https://www.luogu.com.cn/problem/solution/P1434 优先队列+dp 本题状态转移方程一目了然 为了保证状态间无后效性, ...

  6. P1434 [SHOI2002] 滑雪

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

  7. 洛谷P1434 [SHOI2002]滑雪

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

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

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

  9. P1434 [SHOI2002]滑雪(动态规划DP)

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

最新文章

  1. JZOJ 5475. 【NOIP2017提高组正式赛】逛公园
  2. ubuntu install redis/mongo
  3. HashMap 1.7 死循环过程
  4. Taro+react开发(74):taro架构使用
  5. 今天用python的turtle简单画了一副眼镜
  6. nginx设置http强制跳转https
  7. 京沪等地11月房价半年来首涨 平价走量将成主流
  8. Python3的opencv环境搭建简易教程
  9. mybatis-plus 自定义QueryWrapper(一)实现查询函数
  10. Adobe Flex大师之路
  11. Spark课程设计——电影推荐系统
  12. unity material以及各种贴图介绍
  13. Word转图片(使用Spire.doc)
  14. Windows下通过Git上传项目至Github
  15. cad计算机绘注意事项,CAD打印的基本操作和重要的注意事项
  16. Rosalind: DNA核苷酸计数和DNA翻译成RNA
  17. 油溶性Cu,Mn共掺杂量子点光转换材料
  18. PDF如何在线压缩?PDF压缩到最小的方法
  19. AI将光子时间转换成3D图像,通过时间来可视化世界
  20. python实现windows ie代理切换

热门文章

  1. Azure Sphere入门
  2. html5 不允许修改,详解HTML5.2版本带来的修改
  3. 【HTML5】Html5新标签解释及用法
  4. 更换Ubuntu源为清华源
  5. ubuntu系统换源
  6. 帝国CMS 上一篇、下一篇
  7. 检测四川麻将是否胡牌算法的实现
  8. 学生成绩管理系统(六):项目总结
  9. HTML--学习网教程
  10. XDOJ1009--小红帽