Code[VS] 2152 滑雪题解

题目描述 Description

trs喜欢滑雪。他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。为了得到更快的速度,滑行的路线必须向下倾斜。
例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。

输入描述 Input Description

输入文件

第1行: 两个数字r,c(1<=r,c<=100),表示矩阵的行列。
第2..r+1行:每行c个数,表示这个矩阵。

输出描述 Output Description

输出文件

仅一行: 输出1个整数,表示可以滑行的最大长度。

样例输入 Sample Input

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

样例输出 Sample Output

25

数据范围及提示 Data Size & Hint

1s

————————————————————————————分割线————————————————————————————

初见此题时,便想到记忆化DFS的方法,由于本题数据较小,可以轻松过。但是,当数据再大一点,再用递归便不太合适。那么,如何用非递归方法解决这个问题?
仔细观察问题,发现最长上升子序列问题与本题有几分相像,如何将二维问题转为一维问题是解题的关键。
我们将每个山依照高度排序放置到一个一维数组中,并记录下原始的坐标,这时再进行最长上升子序列,只需要在其中,加入两个山是否相邻的判断即可 。
此方法可以避免,数据规模较大时,由于递归层数过深导致的堆栈溢出。同时也十分容易理解。 
 
代码如下:
 //Code By DrSHHHS

 #include "bits/stdc++.h"

 using namespace std ;

 const int maxN =  ;
const int INF = ; struct Slide {int x , y , val ;}; Slide arr[maxN] ;
int f[maxN] ; bool cmp ( Slide a , Slide b ) { return a.val > b.val ;}
int Abs ( int x ) { return x>?x:-x ;}
int Max ( int a , int b ){ return a>b?a:b ; } bool Judge ( int p1 , int p2 ) {//判断两座山是否相邻且严格下降
if (( Abs ( arr[p1].x - arr[p2].x) + Abs ( arr[p1].y - arr[p2].y) )== && arr[p2].val > arr[p1].val) return true ;
else return false ;
} int main ( ) {
int N , M , tmp , K = ,ans = -INF ; scanf("%d%d",&N ,&M ) ;
for ( int i= ; i<=N ; ++i ){
for ( int j= ; j<=M ; ++j ){
K++;
scanf( "%d" , &tmp ) ;//将二维数组读入一个一维数组arr中
arr[K].val = tmp ;
arr[K].x = i ;arr[K].y = j ;//记录原始坐标
}
} sort ( arr+ , arr+K+ , cmp ) ;//排序 f[] = ; for ( int i= ; i<=K ; ++i ){//最长下降子序列
for ( int j= ; j<=i- ; ++j ) {
if ( Judge ( i , j ) ){//判断相邻切严格下降
f[i] = Max ( f[i] , f[j] ) ;
}
}
f[i] = f[i] + ;
} for ( int i= ; i<=K ; ++i ){//找最大值
ans = Max ( f[i] , ans ) ;
} printf ( "%d" , ans ) ; return ;
}
PS : 这个问题可视为最长下降子序列在二维中的拓展。
 
顺便附上记忆化搜索的代码,如下:
 #include "bits/stdc++.h"

 using namespace std ;
const int maxN = ; int h[maxN][maxN] , f[maxN][maxN] ;
int n, m, ans = ; int DFS(int x, int y)
{
if( f[x][y] )return f[x][y];
f[x][y] = ;
if(x > && h[x][y] < h[x - ][y])f[x][y] = max(f[x][y], DFS(x - , y) + );
if(y > && h[x][y] < h[x][y - ])f[x][y] = max(f[x][y], DFS(x, y - ) + );
if(x < n && h[x][y] < h[x + ][y])f[x][y] = max(f[x][y], DFS(x + , y) + );
if(y < m && h[x][y] < h[x][y + ])f[x][y] = max(f[x][y], DFS(x, y + ) + );
ans = max(ans, f[x][y]);
return f[x][y];
}
int main()
{
scanf("%d%d", &n, &m);
for ( int i = ; i <= n ; i++ )
for ( int j = ; j <= m ; j++ )
scanf( "%d" , &h[i][j] ) ;
for(int i = ; i <= n ; i++ )
for(int j = ; j <= m ; j++ )
f[i][j] = DFS( i , j ) ;
printf("%d", ans); return ;
}

2016-09-14 15:45:58

(完)

Code[VS] 2152 滑雪题解的更多相关文章

  1. codevs 2152 滑雪

    2152 滑雪  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场 ...

  2. codevs——2152 滑雪

    2152 滑雪  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场 ...

  3. Code[VS] 1022 覆盖 题解

    Code[VS] 1022 覆盖 题解  Hungary Algorithm 题目传送门:Code[VS] 1022 题目描述 Description 有一个N×M的单位方格中,其中有些方格是水塘,其 ...

  4. Code[VS]1690 开关灯 题解

    Code[VS]1690 开关灯 题解     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description:     YYX家门前 ...

  5. Code[VS] 2370 LCA 题解

    Code[VS] 2370 小机房的树 题解 RMQ 树链剖分 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同 ...

  6. 洛谷[SHOI2002]滑雪题解

    什么破题啊 简直就是浪费我时间! 我每天还被我xf定目标了不知道嘛! 题目 朴素的搜索只能得90分 #include <cstdio> #include <iostream> ...

  7. 洛谷P1434滑雪题解及记忆化搜索的基本步骤

    题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...

  8. Codeforces 965E Short Code 启发式合并 (看题解)

    Short Code 我的想法是建出字典树, 然后让后面节点最多的点优先向上移到不能移为止, 然后gg. 正确做法是对于当前的节点如果没有被占, 那么从它的子树中选出一个深度最大的点换到当前位置. 用 ...

  9. CODE FESTIVAL 2017 Final题解

    传送门 \(A\) 咕咕 const int N=55; const char to[]={"AKIHABARA"}; char s[N];int n; int main(){ s ...

随机推荐

  1. 拷贝,集合,函数,enumerate,内置函数

    1.拷贝 字符串和数字.赋值 id一样 import copy #提供拷贝功能 copy.copy() #原来的和现在的一起修改,不用修改时用浅copy,节省内存,复制最外层 copy.deepcop ...

  2. Java获取当前时间年月日、时间格式化打印、字符串转日期

    package com.sysc.simple; import java.text.ParseException; import java.text.SimpleDateFormat; import ...

  3. ASP.NET 5中的ASP.NET Bundles跑到哪里去了?

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 众所周知,在ASP.NET MVC中很早就存在一个所谓的"bundling and ...

  4. HR外包系统 - 工资计算-几种常见账单计算规则

    01-正常工资计税 (包括同一月多地计税方式) 02-年终奖计税 (包括可分批发放,但计税总额不变)  按工资 除以月份,看落在那个计税区间,获取税率和扣除数,再用总额*税率-扣除数,要考虑当月工资如 ...

  5. leetcode 1_2_3_7

    来自lknny.com,欢迎交流学习!点击 tags: [leetcode,algorithm] categories: algorithm --- Two Sum Given an array of ...

  6. CRC校验(转)

    CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据 ...

  7. VPS -Digital Ocean -初试以及VPN的搭建

    首先恭喜你找到这篇博客,它会带你走出困境. 题外话(请忽略):一直以来想搞一个VPS,终于在自己的刺激下试了一下Digital Ocean,还没有使用很长时间不做太多评论,唯一给我的感觉是各种操作还算 ...

  8. jq中.prop()与attr()的区别

    一,定义 prop() 方法设置或返回被选元素的属性和值.prop() 方法应该用于检索属性值 attr()  方法设置或返回被选元素的属性和值.如需检索 HTML 属性,请使用 attr() 方法代 ...

  9. 深入理解KMP算法

    前言:本人最近在看<大话数据结构>字符串模式匹配算法的内容,但是看得很迷糊,这本书中这块的内容感觉基本是严蔚敏<数据结构>的一个翻版,此书中给出的代码实现确实非常精炼,但是个人 ...

  10. 关闭Android/iPhone浏览器自动识别数字为电话号码

    <meta name="format-detection" content="telephone=no"><meta http-equiv=& ...