https://www.luogu.com.cn/problem/P1434
朴素算法:会TLE一个点

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
int f[N][N],a[N][N],n,m;
bool vis[N][N];
int ans;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int dfs(int x,int y)
{int res=0;vis[x][y]=true;int s=0;for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx>=1&&tempx<=n&&tempy>=1&&tempy<=m&&!vis[tempx][tempy]){if(a[tempx][tempy]<a[x][y]){memset(vis,0,sizeof vis);s=dfs(tempx,tempy);}}res=max(res,s);//求四个方向中最大的那一段路}return res+1;//加上本身的那一步
}
int main(void)
{cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){memset(vis,0,sizeof vis);ans=max(ans,dfs(i,j));}}cout<<ans<<endl;return 0;
}

记忆化搜索优化:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
int f[N][N],a[N][N],n,m;
bool vis[N][N];
int ans;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int dfs(int x,int y)
{int res=0;vis[x][y]=true;int s=0;for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx>=1&&tempx<=n&&tempy>=1&&tempy<=m&&!vis[tempx][tempy]){if(a[tempx][tempy]<a[x][y]){if(f[tempx][tempy]) s=f[tempx][tempy];//如果当前之前搜过了直接返回else{memset(vis,0,sizeof vis);s=dfs(tempx,tempy);}}}res=max(res,s);}return res+1;
}
int main(void)
{cin>>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++){memset(vis,0,sizeof vis);int t=dfs(i,j);f[i][j]=t;//记录状态ans=max(ans,t);}}cout<<ans<<endl;return 0;
}

进一步的记忆化搜索优化:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
int f[N][N],a[N][N],n,m;
bool vis[N][N];
int ans;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int dfs(int x,int y)
{int res=0;vis[x][y]=true;int s=0;for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx>=1&&tempx<=n&&tempy>=1&&tempy<=m&&!vis[tempx][tempy]){if(a[tempx][tempy]<a[x][y]){if(f[tempx][tempy]) s=f[tempx][tempy];else{memset(vis,0,sizeof vis);s=dfs(tempx,tempy);f[tempx][tempy]=s;}}}res=max(res,s);}return res+1;
}
int main(void)
{cin>>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++){memset(vis,0,sizeof vis);int t=dfs(i,j);f[i][j]=t;ans=max(ans,t);}}cout<<ans<<endl;return 0;
}
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
int f[N][N],a[N][N],n,m;
bool vis[N][N];
int ans;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int dfs(int x,int y)
{int res=0;vis[x][y]=true;int s=0;for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx>=1&&tempx<=n&&tempy>=1&&tempy<=m&&!vis[tempx][tempy]){if(a[tempx][tempy]<a[x][y]){if(f[tempx][tempy]) s=f[tempx][tempy];else{memset(vis,0,sizeof vis);s=dfs(tempx,tempy);f[tempx][tempy]=s;}}}res=max(res,s);}f[x][y]=res+1;return f[x][y];
}
int main(void)
{cin>>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++){memset(vis,0,sizeof vis);int t=dfs(i,j);ans=max(ans,t);}}cout<<ans<<endl;return 0;
}

P1434 [SHOI2002]滑雪 【记忆化搜索】相关推荐

  1. POJ1088 滑雪 记忆化搜索

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 107548   Accepted: 40980 Description ...

  2. poj1088 滑雪 记忆化搜索

    我是渣渣 我是渣渣 ....记忆化搜索 看了学长的代码 和算法竞赛入门经典这本书才勉勉强强看懂点... #include <stdio.h> #include <string.h&g ...

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

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

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

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

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

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

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

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

  7. 【记忆化搜索】【线性化DP】滑雪 (ssl 1202/luogu 1434/pku 1088)

    滑雪滑雪滑雪 ssl 1202 luogu 1434 pku 1088 题目大意: 有一个N*M的矩阵,每个位置都有一个数,可以从大的数走向小的数,问可走的路最长是多少 原题 Michael喜欢滑雪百 ...

  8. POJ1088 Bailian1088 滑雪【DFS+记忆化搜索】

    滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 114685 Accepted: 43807 Description Mic ...

  9. POJ1088 滑雪 dp入门 记忆化搜索

    题意:给你一个r*c的矩阵,只能从图上数字大的地方滑向数字小的地方,问你一次性最多滑过多少个数字. 思路:记忆化搜索.顺序搜索,记录地图上每一个点出发所能达到的最远长度,若某一点标记过说明当前点的最远 ...

  10. 递归 dfs 记忆化搜索 动态规划

    今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态--这种用自已来 ...

最新文章

  1. golang中的new和make的区别
  2. vue中引入第三方字体图标库iconfont,及iconfont引入彩色图标
  3. 成功解决VirtualBox is not installed. Please re-run the Toolbox Installer and try again.
  4. 以DES的方式实现对称加密,并提供密钥
  5. MySQL 高级 —— MVCC 多版本并发控制
  6. 年度总结 | 2020 Flink 学习路线总结
  7. 在iphone上安装多个微信 【微信营销必备】
  8. 调试uwp 程序 出现的黑框
  9. 西门子s300编程实例_数控车床加工编程典型实例分析(西门子802S数控系统编程教学)...
  10. RabbitMQ-KeepLive
  11. 电气器件系列三十三:步进电机驱动器
  12. Theano入门神经网络(三)
  13. Java实现手机号码、邮箱账号加密
  14. existed hive ods_hive外部表
  15. 【POI2012】SZA-Cloakroom
  16. axure9实用操作设置鼠标单击交互事件为什么没响应
  17. 3D hand pose:BMC
  18. 程序龙的密码(递归算法)
  19. SVN迁移至GIT,并附带历史提交记录
  20. EasyCVR边缘计算网关助力安防视频场景化AI落地,让智能无处不在

热门文章

  1. Python---爬虫---爬取万余张图片,分门别类
  2. 上古卷轴5:重制版窗口化运行1920*1080画面显示不全的问题解决
  3. word中公式全篇一次性转math type公式方法,而且出现omml2mml.xsl 问题的解决方法(有效!!!)
  4. git_ Git 工具 - 储藏(Stashing)
  5. 富士施乐打印机DP P355d设置说明
  6. 发生系统错误 67,找不到网络名
  7. Unity网络编程教学视频(本人第一次录制)
  8. IDEA上tomcat日志输出乱码 淇℃伅 鏈嶅姟鍣ㄧ増鏈彿(锛 解决办法
  9. ICS bomblab总结
  10. 近14年美股各个板块收益之间的差异