洛谷 P1434 [SHOI2002]滑雪
这道题适合记忆化练手
毕竟总有些大佬虐题。
这个题有几个剪枝
1.记忆化
这个不用多说了吧
剪枝就是
如果 当前点到下面一个点的目前下降的高度+1 小于 下面那个点 能下降的高度
那么反过来,这个点不也有更大的值吗
既然这样的话,又可以得出
这个点不是最优解了,因为另外一条路线已经滑了更大的一个高度了,剩下高度相同,你觉得哪个滑的高
举例: 已知a>b 那么必然的,a+c>b+c
2.从高到低枚举起点。
可以肯定的是,目前选择的这个点的高度已经是这次dfs最大能够滑雪的高度了,如果有比这个高的答案,那么我们已经得到了而且后面不会有比这个高的答案了,所以后面的剪枝都不用做了
这个剪枝优化前的效果:

优化后:

懂了吧,上代码
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstring> using namespace std; int n,m;
struct p{
int x,y,height;
};
int a[][];
int dx[]={,,,-};
int dy[]={,-,,};
p s[];
int f[][];
int mmx=;
int cmp(p a,p b)
{
return a.height>b.height; //sort: <则为从小到大 >则为从大到小
} void dfs(int x,int y)
{
for(int i=;i<=;i++)
{
int nx,ny;
nx=x+dx[i];
ny=y+dy[i];
if(nx>=&&nx<=n&&ny>=&&ny<=m&&a[x][y]>a[nx][ny]) //判断是否越界以及能否走到那个点
{
if(f[nx][ny]<f[x][y]+)
{
f[nx][ny]=f[x][y]+;
mmx=max(f[nx][ny],mmx);
dfs(nx,ny);
}
}
}
return ;
}
int main()
{
scanf("%d %d",&n,&m);
int i,j;
int tot=;
for(i=;i<=n;i++)
for(j=;j<=m;j++)
{
f[i][j]=;
scanf("%d",&a[i][j]);
s[++tot].height=a[i][j];
s[tot].x=i;
s[tot].y=j;
}
sort(s+,s+tot+,cmp); //做一遍sort得到从高到低的位置(点)
for(i=;i<=tot;i++)
{
dfs(s[i].x,s[i].y);
if(tot-i+<mmx) break;
}
printf("%d",mmx);
return ;
}
洛谷 P1434 [SHOI2002]滑雪的更多相关文章
- 洛谷P1434 [SHOI2002]滑雪
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- 洛谷 P1434 [SHOI2002]滑雪(DP,记忆化搜索)
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- 洛谷 P1434 [SHOI2002]滑雪 解题报告
这题方法有很多, 这里介绍2种: 方法1 很容易想到搜索, bfs或dfs应该都可以, 就不放代码了: 方法2 这题还可以用 dp 来做. 做法:先将每个点按照高度从小到大排序,因为大的点只能向小的点 ...
- 洛谷-P1434 [SHOI2002]滑雪 (记忆化搜索)
题意:有一个\(R*C\)的矩阵,可以从矩阵中的任意一个数开始,每次都可以向上下左右选一个比当前位置小的数走,求走到\(1\)的最长路径长度. 题解:这题很明显看到就知道是dfs,但是直接爆搜会TLE ...
- [洛谷P1434] [SHOI2007]滑雪
题目链接: here we go 题外话: 谁能想到这是一道咕了两年的\(AC\)呢--当年是在搜索还半懂不懂的时候遇到的这道题,感觉真是难得要命()所以一直拖着不做,后面就下意识地逃避了搜索相关的内 ...
- 【洛谷1434 [SHOI2002]滑雪】记忆化搜索
AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) memset(a,b,sizeof(a)) typed ...
- [BFS]P1434 [SHOI2002]滑雪
P1434 [SHOI2002]滑雪 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者 ...
- 洛谷P1434滑雪讲解
题源:[戳这里] 洛谷博客链接:[戳这里] 我觉得这道题主要方法应该有两种: 动态规划 搜索 下面会分别对这两种方法进行简述 一,动态规划法首先的想法是用L(i,j)表示从点(i,j)出发能到达的最长 ...
- 洛谷 P1291 [SHOI2002]百事世界杯之旅 解题报告
P1291 [SHOI2002]百事世界杯之旅 题目描述 "--在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽 ...
随机推荐
- HDFS Java API
HDFS Java API 搭建Hadoop客户端与Java访问HDFS集群
- AtCoder Regular Contest 083 E - Bichrome Tree
题目传送门:https://arc083.contest.atcoder.jp/tasks/arc083_c 题目大意: 给定一棵树,你可以给这些点任意黑白染色,并且赋上权值,现给定一个序列\(X_i ...
- 看Facebook是如何优化React Native性能
原文出处: facebook 译文出处:@Siva海浪高 该文章翻译自Facebook官方博客,传送门 React Native 允许我们运用 React 和 Relay 提供的声明式的编程模型, ...
- Array(数组)的基本方法
1.定义:var arr=new Array ("12" , "zhang") 2.简写:var arr=[ 12 , "zhang&quo ...
- 人物丨让小三吐血,让原配泣血——24K渣男郎咸平
http://url.cn/5swgmythttps://www.toutiao.com/i6650650793743483395人物丨让小三吐血,让原配泣血——24K渣男郎咸平 人物丨让小三吐血,让 ...
- 判断空间上三个点是否共线问题【找bug篇】
判断空间上三个点是否在同一直线上[找bug篇] 作者:Vashon 时间:20150601 发布时间:20150718 一.拿到问题,首先分析并理清思路. 判断三点是否在同一条直线上需满足以下几点 ...
- 下载JSTL方法
第一步:访问 http://www.apache.org/dist/ 第二步:点击jakarta
- AJAX中文乱码解决方案
通过AJAX获取数据中文乱码解决方案: @ResponseBody 作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到 ...
- 移除sql数据所有链接用户
use master; go declare @temp nvarchar(20) declare myCurse cursor for select spid from sy ...
- toast插件的简单封装(样式适用pc后台管理系统的场景)
直接分三个步骤吧: 1.手写一个toast.vue组件 <template> <transition name="toast-fade"> <div ...