滑雪
题目描述
trs喜欢滑雪。他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。为了得到更快的速度,滑行的路线必须向下倾斜。 例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
输入格式
第1行: 两个数字r,c(1<=r,c<=100),表示矩阵的行列。 第2..r+1行:每行c个数,表示这个矩阵。
输出格式
仅一行: 输出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
输出样例
25
主要思路
题目要求求一个最长的二维下降序列,并且你只能向上下左右走,只能走更低的位置,这样的话,我们搜索每一个点能够下降的最长的长度,我们就可以用DFS去搜索,直到搜到边界返回(边界就是上下左右都不能走,然后自己的值是 1 ),但是这样搜索一定会超时,因为我们进行了太多的重复搜索。因为,当这个位置已经被搜过后,那这个点就是此时能够到最低点的最长的坡,当我们下次搜索时,还会进去继续搜索,所以记忆化搜索就出现了,我们用一个数组来保存当我们搜索过的值,就可以避免重复搜索,每当我们再搜索到这里时,我们直接用它已经搜索过的值即可。
记忆化搜索
什么是记忆化搜索呢?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用。
用一个公式简单地说:记忆化搜索=搜索的形式+动态规划的思想。
——————————AC代码
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1001][1001],ans,fx[4][2]={0,1,1,0,-1,0,0,-1},step[1001][1001];
int dfs(int x,int y){
int mmax=0;
if(step[x][y]!=0)return step[x][y];
step[x][y]=1;//最小的点为1
for(int i=0;i<4;i++){
int xx=x+fx[i][0];
int yy=y+fx[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]<a[x][y])step[x][y]=max(step[x][y],dfs(xx,yy)+1);
}
return step[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],step[i][j]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
ans=max(ans,dfs(i,j));
}
cout<<ans;
return 0;
}
——————————QAQ
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122208
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话