skiing

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 5
描述
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。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

输入
第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
后面是下一组数据;
输出
输出最长区域的长度。

算法分析:

一看本题就感觉这不是才看过的单调递减子序列问题么,但这个难点在于数据并不是线性的,每一步都有四个方向可走,于是乎,,深搜解此题必须是手到擒来啊。。注意中间的剪枝问题,利用记忆话数组去除重复的计算类似于递归型DP,下面看一个来自网上的深搜代码:

#include<stdio.h>
#include<string.h>
int a[101][101],visit[101][101];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int s,t,max,r,c;
int bfs(int x,int y)
{if(visit[x][y]>1)//**剪枝,不剪枝应该是TLE的,测试数据有点弱,不过就算没TLE,加了剪枝的时间优化了不少*//{return visit[x][y];//**如果以前搜索过这点,就直接返回搜索的这点,不用再进行搜索**//}for(int k=0;k<4;k++){s=x+dx[k];t=y+dy[k];if(s>=0 && s<r && t>=0 && t<c && a[x][y]<a[s][t])//**搜索的范围。DP看作单调递增数列**//{max=bfs(s,t);//**动态规划**//if(visit[x][y]<max+1){visit[x][y]=max+1;}}}return visit[x][y];//**返回这点能取得的最大值**//
}
int main()
{int ncases,i,j,ans;scanf("%d",&ncases);while(ncases--){ans=-1;scanf("%d %d",&r,&c);for(i=0;i<=r-1;i++){for(j=0;j<=c-1;j++){scanf("%d",&a[i][j]);visit[i][j]=1;}}for(i=0;i<=r-1;i++){for(j=0;j<=c-1;j++){bfs(i,j);if(visit[i][j]>ans){ans=visit[i][j];}}}printf("%d\n",ans);}return 0;
}        

注意,这里为了保证以任意起点开始搜索,必须要以m*n个起点进行向下深搜,这也自然使得时间复杂度提升了,于是乎我选择的是人人为我型动归,以其他四个方向的值来不断更新当前点的值,然后不断进行递推,但问题来了,为了使得每次递归都以当前最低位置开始,那么每一次递推的起点怎么确定呢???这里我的确被坑了一下,想了各种不同的方案,比如,增设一维数组来保存map,j进行排序,但怎么返回坐标呢,之后我有通过双循环不断产生去除上一个最低位置后的最低位置,但这不是比深搜还有麻烦,最后无奈之下,结构体走起。。。问题就直接解决了


#include<iostream>
#include<algorithm>
using namespace std;
int map[101][101];
int d[101][101];
struct node{int x,y;int value;
}tmap[10001];
int K;
int dir[2][4]={{1,0,-1,0},{0,1,0,-1}};
int max(int a,int b)
{return a>b?a:b;}
int comp(node a,node b)
{return a.value<b.value;
}
int dp(int m,int n)
{int i,j,k,x,y,ans=0,p;for(p=0;p<K;p++){i=tmap[p].x;j=tmap[p].y;for(k=0;k<4;k++){x=i+dir[0][k];y=j+dir[1][k];if(x>=1&&x<=m&&y>=1&&y<=n&&map[x][y]<map[i][j])d[i][j]=max(d[i][j],d[x][y]+1);ans=ans>d[i][j]?ans:d[i][j];}}return ans;
}
int main()
{int N,m,n,i,j;cin>>N;while(N--){K=0;cin>>m>>n;for(i=1;i<=m;i++)for(j=1;j<=n;j++){cin>>map[i][j];d[i][j]=1;tmap[K].x=i;tmap[K].y=j;tmap[K++].value=map[i][j];}sort(tmap,tmap+K,comp);cout<<dp(m,n)<<endl;}return 0;
}        

NYOJ 10 skiing (深搜和动归)相关推荐

  1. nyoj 10 skiing(DAG上的最长路,备忘录方法)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑 ...

  2. NYOJ 10 skiing

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑 ...

  3. 二叉树的深搜(DFS)与广搜(BFS)

    转载自: https://blog.csdn.net/u011613367/article/details/50950408 数据结构中的有两个比较重要的算法.深度优先搜索和广度优先搜索. 二叉树中的 ...

  4. 【2018.3.10】模拟赛之一-ssl2574Closest【深搜】

    目录地址 前言 感谢黎某儿(划掉)教我这道题☆⌒(*^-゜)v. 正题 给出两个n位数A,B.我们需要找到两个最近的靠近A的n位数(第一个比A大或与A相等,第二个严格比A小),使得它们的十进制表示是B ...

  5. NYoj 20 深搜

    是一道无根树转化为有根树的题目,暑假时迷迷糊糊的ac了,其实并没有理解其实质,,今天又重新做了一遍,才知道原来无根树转化为有根树实质就是一个深搜的过程,,把一条路径上的点都找出即可...题目: 在一个 ...

  6. 方格取数(多线程dp,深搜)

    https://www.luogu.org/problem/P1004 题目描述 设有N×N的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): 某 ...

  7. 水叮当的舞步 深搜

    背景 Background 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ 描 ...

  8. [数据结构] 迷宫问题(栈和队列,深搜和广搜)

    代码: #include <iostream> #include <string.h> #include <stack> #include <queue> ...

  9. 迷宫问题最短捷径c语言深搜,迷宫问题 C语言实现(深搜)

    问题描述: 2015年05月21日 10:24:05 这是我自己出的一道题   其原型基于迷宫问题,用深搜来解决的!我就简单的说一说吧! 给定一个N * M 的迷宫!,1代表有障碍,0代表无障碍可通行 ...

最新文章

  1. 利用Java自带的MD5加密java.security.MessageDigest;
  2. 人工神经网络之BP神经网络模型
  3. tomcat命令无法启动 the catalina_home environment variable is not defined correctly this environment variab
  4. typeScript模块四
  5. Spring security/Shiro ---登陆成功后返回登陆前界面<页面重定向>
  6. Oracle入门(十四C)之转换函数
  7. Java 8快多少?
  8. 关于CEdit控件的透明
  9. mysql批量添加报错_技术分享 | MySQL 在批量插入时捕捉错误信息
  10. 循环获取另一个php变量,通过引用将多个变量传递给foreach循环(php)
  11. 成外集训小记(更新到7.31)
  12. Docker、CentOS 8遭弃用,GPT-3、M1芯片撼动技术圈,盘点2020影响开发者的十大事件!
  13. dotnetfx40lp 不能安装在d盘_使用小白一键重装系统给电脑安装双系统教程
  14. 玩转3D全息图像!AI即刻生成
  15. Java字符串排序设计(升序排列)
  16. 获取QQ好友列表接口分析
  17. 自学网络 arp_ignore/arp_announce
  18. shopex4.8.5 php5.6,惊爆漏洞ShopEX4.8.5隐患漏洞,最终解决方法ShopEX4.8.5安装完成后打开显示:Access denied by install.lock...
  19. 一个经济学果粉对国内iOS游戏厂商的5点斥责和5个建议
  20. 移动通信各制式、调制的速率及频谱利用率(2G-4G)

热门文章

  1. java 周次_java处理年、月、周次以及起至日期大全
  2. 陪玩网站源码的PHP后台开发,文件上传与下载的实现
  3. Python - 字符串转日期时间,格式的处理以及时间加减计算
  4. K8S是什么? K8S实现了什么?
  5. 关于绩效考核中项目经理每周培训的答复
  6. js中数组的遍历的几种方法
  7. 开放源码!大学生用C语言自制网站服务器 只要100行代码!
  8. 动态获取iphone键盘的高度
  9. 人工智能风口,Python程序员的狂欢与企业主的哀嚎。
  10. 使用Systemback工具克隆Ubuntu18.04系统