题目描述

Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子:

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

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可行的滑坡为24-17-16-1(从24开始,在1结束)。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

输入输出格式

输入格式:

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

输出格式:

输出区域中最长滑坡的长度。

输入输出样例

输入样例#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
输出样例#1: 25

[思路]:
简单dp,虽然它在有技巧的搜索里面(其实dp好像和记忆化搜索差不多逃),然而怎么做呢?
dp[i][j]只能从四个方向走过来,而且四个方向的点的高度要大于这个点,于是就可以了.
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<string>
#include<cstring>
using namespace std;
const int maxn=;
const int minn=-;
inline int read()
{
char c = getchar();
int x = , f = ;
while(c < '' || c > '')
{
if(c == '-') f = -;
c = getchar();
}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int f[][];
int a[][];
int n,m,sum;
int dp(int x,int y)
{
if (f[x][y]) return f[x][y];
int sum=;
if (x->)
if (a[x-][y]>a[x][y])
sum=max(sum,dp(x-,y));
if (x+>)
if (a[x+][y]>a[x][y])
sum=max(sum,dp(x+,y));
if (y->)
if (a[x][y-]>a[x][y])
sum=max(sum,dp(x,y-));
if (y+>)
if (a[x][y+]>a[x][y])
sum=max(sum,dp(x,y+));
f[x][y]=sum+;
return f[x][y];
}
int main()
{
n=read();
m=read();
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
{
a[i][j]=read();
}
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
{
if (f[i][j]==)
{
f[i][j]=dp(i,j);
}
sum=max(sum,f[i][j]);
}
printf("%d",sum);
return ;
}

然后我看了看题解,发现有记忆化搜索就厚颜无耻地粘过来了(嘿嘿)

by 一扶苏一 更新时间: 2018-02-24 15:57

/*本题f数组表示当前坐标点滑下去的最大长度。
状态转移方程:f[i][j]=max{f[i±1][j]+1,f[i][j±1}+1,f[i][j]}
dfs函数采用逆推法。
*/
#include<cstdio>
#define maxn 110
#define max(a,b) a>b?a:b
using namespace std;
int map[maxn][maxn],f[maxn][maxn],r,c,dfs(int,int),m;
/*
map存跑道,f存答案,
r,c为纵坐标横坐标,
dfs搜索函数,两个变量分别为被搜索点的纵、横坐标。
底下函数x,y打反了, 即x代表纵坐标,x代表横坐标,别看晕了
m为最长跑道长度,全局变量初始值为0。
*/
int main(){
scanf("%d%d",&r,&c);
for(int i=;i<=r;i++)
for(int j=;j<=c;j++){
scanf("%d",&map[i][j]);f[i][j]=;
/*
输入,因为自己滑到自己的长度是1,所以答案数组初始化为1。
*/
}
for(int i=;i<=r;i++)
for(int j=;j<=c;j++)
m=max(m,dfs(i,j)); //进行搜索,如果结果比已知答案更大就更新。
printf("%d",m); //输出答案
return ;
}
inline int dfs(int x,int y){ //搜索函数,其中x代表纵坐标,y代表横坐标,一开始打反了,后面懒得改了,别看晕了
if(f[x][y]!=) return f[x][y];
int b=;
/*
以下四句if,每个括号中前四句条件是否到达边界,最后一条件判断是否当前坐标比搜索坐标高。
*/
if(x>=&&y>=&&x<r&&y<=c&&map[x][y]>map[x+][y]) b=max(b,(dfs(x+,y)+));
if(x>=&&y>=&&x<=r&&y<c&&map[x][y]>map[x][y+]) b=max(b,(dfs(x,y+)+));
if(x>&&y>=&&x<=r&&y<=c&&map[x][y]>map[x-][y]) b=max(b,(dfs(x-,y)+));
if(x>=&&y>&&x<=r&&y<=c&&map[x][y]>map[x][y-]) b=max(b,(dfs(x,y-)+));
f[x][y]=max(f[x][y],b); //防止4个if都不成立即b为0的情况。故取最大值
return f[x][y];
}

【dp】P1434 [SHOI2002]滑雪的更多相关文章

  1. [BFS]P1434 [SHOI2002]滑雪

    P1434 [SHOI2002]滑雪 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者 ...

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

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

  3. P1434 [SHOI2002]滑雪

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

  4. P1434 [SHOI2002]滑雪 dfs

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

  5. 洛谷 P1434 [SHOI2002]滑雪 解题报告

    这题方法有很多, 这里介绍2种: 方法1 很容易想到搜索, bfs或dfs应该都可以, 就不放代码了: 方法2 这题还可以用 dp 来做. 做法:先将每个点按照高度从小到大排序,因为大的点只能向小的点 ...

  6. 洛谷 P1434 [SHOI2002]滑雪

    这道题适合记忆化练手 毕竟总有些大佬虐题. 这个题有几个剪枝 1.记忆化 这个不用多说了吧 剪枝就是 如果 当前点到下面一个点的目前下降的高度+1 小于 下面那个点 能下降的高度 那么反过来,这个点不 ...

  7. 洛谷P1434 [SHOI2002]滑雪

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

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

    题意:有一个\(R*C\)的矩阵,可以从矩阵中的任意一个数开始,每次都可以向上下左右选一个比当前位置小的数走,求走到\(1\)的最长路径长度. 题解:这题很明显看到就知道是dfs,但是直接爆搜会TLE ...

  9. [OpenJudge90][序列DP+乱搞]滑雪

    滑雪 总时间限制: 1000ms 内存限制: 65536kB [描述] Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次 ...

随机推荐

  1. Python_面向对象基础

    概念 类 一类抽象的事物,是描述了一类事物有哪些属性或者行为,但不是具体——模子. 实例 一个依托于类的规范存在的,被赋予了具体属性值的实际存在的物体. 对象 就是实例,实例的另外一个名称,相当于别名 ...

  2. jmeter之批量修改请求路径

    今天工作时碰到一个问题:测试环境中由于tomcat没指定webapps下的文件夹名,导致tomcat使用了webapps下默认的文件夹名,而我的jmeter脚本都已经做出来了,一共83个接口,挨个改路 ...

  3. 文件搜索神器之everything

    之前我提到了,在本地快速的进行文件的检索是平常工作中必要的部分,一个好的搜索软件会大大的提升我们的工作效率.就是它,everything,官方的网站地址是http://www.voidtools.co ...

  4. MySQL数据性能优化-修改方法与步骤

    原文:http://bbs.landingbj.com/t-0-240421-1.html 数据库优化应该是每个设计到数据库操作应用必须涉及到的操作. 经常调试修改数据库性能主要有三个方面 1.MyS ...

  5. [转帖]Huge Page 是否是拯救性能的万能良药?

    Huge Page 是否是拯救性能的万能良药? 本文将分析是否Huge Page在任何条件下(特别是NUMA架构下)都能带来性能提升. 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢 ...

  6. jQuery ajax解析xml文件demo

    解析xml文件,然后将城市列表还原到下拉列表框中:当选择下拉列表框时,在对应的文本框中显示该城市信息. 前端代码: <!doctype html> <html> <hea ...

  7. liunx 运维知识四部分

    一. 权限介绍及文件权限测试 二. 目录权限测试 三. 默认控制权限umask 四. chown修改属性和属组 五. 网站安全权限介绍 六. 隐藏属性介绍 七. 特殊权限s 八. 特殊权限t 九. 用 ...

  8. 国内的go get问题的解决

    在国内采用go get有时会下载不到一些网站如golang.org的依赖包. 方法1(亲测有效): gopm 代替go 下载第三方依赖包可以采用gopm从golang.org一些镜像网站上下载. 注意 ...

  9. Linux基础学习笔记2-文件管理和重定向

    本节内容 1)文件系统结构元素 2)创建和查看文件 3)复制.转移和删除文件 4)软和硬链接 5)三种I/O设备 6)把I/O重定向至文件 7)使用管道 文件系统和结构 文件系统 文件和目录被组织成一 ...

  10. 【C/C++】实现龙贝格算法

    1. 复化梯形法公式以及递推化 复化梯形法是一种有效改善求积公式精度的方法.将[a,b]区间n等分,步长h = (b-a)/n,分点xk = a + kh.复化求积公式就是将这n等分的每一个小区间进行 ...