P1434 [SHOI2002]滑雪 【记忆化搜索】
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]滑雪 【记忆化搜索】相关推荐
- POJ1088 滑雪 记忆化搜索
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 107548 Accepted: 40980 Description ...
- poj1088 滑雪 记忆化搜索
我是渣渣 我是渣渣 ....记忆化搜索 看了学长的代码 和算法竞赛入门经典这本书才勉勉强强看懂点... #include <stdio.h> #include <string.h&g ...
- [P1434 [SHOI2002]滑雪](DFS,记忆化搜索)
P1434 [SHOI2002]滑雪 题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你 ...
- 洛谷 P1434 [SHOI2002] 滑雪(优先队列+dp / 记忆化搜索)
P1434 [SHOI2002] 滑雪https://www.luogu.com.cn/problem/solution/P1434 优先队列+dp 本题状态转移方程一目了然 为了保证状态间无后效性, ...
- 洛谷 P1434 [SHOI2002]滑雪(DP,记忆化搜索)
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- 洛谷 p1434 滑雪【记忆化搜索】
<题目链接> Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- 【记忆化搜索】【线性化DP】滑雪 (ssl 1202/luogu 1434/pku 1088)
滑雪滑雪滑雪 ssl 1202 luogu 1434 pku 1088 题目大意: 有一个N*M的矩阵,每个位置都有一个数,可以从大的数走向小的数,问可走的路最长是多少 原题 Michael喜欢滑雪百 ...
- POJ1088 Bailian1088 滑雪【DFS+记忆化搜索】
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 114685 Accepted: 43807 Description Mic ...
- POJ1088 滑雪 dp入门 记忆化搜索
题意:给你一个r*c的矩阵,只能从图上数字大的地方滑向数字小的地方,问你一次性最多滑过多少个数字. 思路:记忆化搜索.顺序搜索,记录地图上每一个点出发所能达到的最远长度,若某一点标记过说明当前点的最远 ...
- 递归 dfs 记忆化搜索 动态规划
今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态--这种用自已来 ...
最新文章
- golang中的new和make的区别
- vue中引入第三方字体图标库iconfont,及iconfont引入彩色图标
- 成功解决VirtualBox is not installed. Please re-run the Toolbox Installer and try again.
- 以DES的方式实现对称加密,并提供密钥
- MySQL 高级 —— MVCC 多版本并发控制
- 年度总结 | 2020 Flink 学习路线总结
- 在iphone上安装多个微信 【微信营销必备】
- 调试uwp 程序 出现的黑框
- 西门子s300编程实例_数控车床加工编程典型实例分析(西门子802S数控系统编程教学)...
- RabbitMQ-KeepLive
- 电气器件系列三十三:步进电机驱动器
- Theano入门神经网络(三)
- Java实现手机号码、邮箱账号加密
- existed hive ods_hive外部表
- 【POI2012】SZA-Cloakroom
- axure9实用操作设置鼠标单击交互事件为什么没响应
- 3D hand pose:BMC
- 程序龙的密码(递归算法)
- SVN迁移至GIT,并附带历史提交记录
- EasyCVR边缘计算网关助力安防视频场景化AI落地,让智能无处不在
热门文章
- Python---爬虫---爬取万余张图片,分门别类
- 上古卷轴5:重制版窗口化运行1920*1080画面显示不全的问题解决
- word中公式全篇一次性转math type公式方法,而且出现omml2mml.xsl 问题的解决方法(有效!!!)
- git_ Git 工具 - 储藏(Stashing)
- 富士施乐打印机DP P355d设置说明
- 发生系统错误 67,找不到网络名
- Unity网络编程教学视频(本人第一次录制)
- IDEA上tomcat日志输出乱码 淇℃伅 鏈嶅姟鍣ㄧ増鏈彿(锛 解决办法
- ICS bomblab总结
- 近14年美股各个板块收益之间的差异