Description

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更长。事实上,这是最长的一条。

Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

Output

输出最长区域的长度。

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

代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 int c,r;
 4 int zf[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
 5 int snow[110][110];
 6 int D[110][110];
 7 int dfs(int x,int y){
 8     if(D[x][y]!=0){
 9         return D[x][y];
10     }
11     int maxx=1,x1,y1,kk;
12     for(int i=0;i<4;i++){
13         x1=x+zf[i][0];
14         y1=y+zf[i][1];
15         if(x1 >= 0 && x1 < r && y1 >= 0 && y1 < c && snow[x][y] > snow[x1][y1]){
16             kk=dfs(x1,y1)+1;
17             if(kk>maxx){
18                 maxx=kk;
19             }
20         }
21     }
22     return maxx;
23 }
24 int main()
25 {
26     int ans=0;
27     scanf("%d %d",&r,&c);
28     for(int i=0;i<r;i++){
29         for(int j=0;j<c;j++){
30             scanf("%d",&snow[i][j]);
31         }
32     }
33     memset(D,0,sizeof(D));
34     for(int i=0;i<r;i++){
35         for(int j=0;j<c;j++){
36             D[i][j]=dfs(i,j);
37             if(D[i][j] > ans){
38                 ans = D[i][j];
39             }
40         }
41     }
42     printf("%d\n",ans);
43
44     return 0;
45 }

思路解析:

我真的要哭了!这题9点写完的。检查到10点。然后又找安安和爽老板帮我看。结果最后是主函数的i++写成了r++!!!我去年买了个表啊!!

咳咳,言归正传,这题用记忆型DP,D数组储存的是在某个点的最大高度。所以在DFS函数最前面来判断,这样调用直接节省了很多时间,不会超时。然后再利用DFS深搜,搜到答案返回,更新最大值,搜到最后,输出最大值,大功告成。

转载于:https://www.cnblogs.com/xzt6/p/5751286.html

POJ_1088 滑雪(记忆型DP+DFS)相关推荐

  1. Java算法学习:蓝桥杯——地宫寻宝(DFS+动态规划—记忆型递归)

    Java算法学习:蓝桥杯--地宫寻宝(DFS✖记忆型递归) 题目: 标题:地宫取宝X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签.地宫的入口在左上角,出 ...

  2. 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof

    题目传送门 1 /* 2 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 3 ans = min (ans, max (dp[x][y-i], dp[x-1][i ...

  3. 钢条切割(记忆型递归)dp

    题目: Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案. 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2 ...

  4. 蓝桥杯:生命之树【树型dp】

    之前本菜还没学树型dp的时候,下意识地认为这个东西很难,感觉这个东西结合了搜索+dp这两座算法界的大山必定很难,但万万没想到啊,这个东西很像我之前讲的记忆化搜索,甚至我认为,记忆化搜索的一个作用就是将 ...

  5. 其他OJ 树型DP 选课

    在朱全民的PPT介绍的一个树型DP经典题,<选课>,中文题目,不结束 找了很久找到了可以提交的OJ,重庆八中 http://www.cqoi.net:2012/JudgeOnline/pr ...

  6. 【树型DP】加分二叉树

    问题 b: [树型DP]加分二叉树 时间限制: 1 Sec  内存限制: 64 MB 提交: 8  解决: 6 [提交] [状态] [讨论版] [命题人:admin] 题目描述 科技忽略了过程就是魔法 ...

  7. 二叉苹果树(树型DP+背包)

    二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号 ...

  8. POJ3342 Party at Hali-Bula(树型DP求最大独立集+唯一解判断)

    题意: 公司参加聚会,要求员工不能和他的上司同时参加,求最多能参加几个人并且判断解是否唯一. 要点: 树型DP的经典题,用dp[u][1]表示选取u的最大值,dp[u][0]表示不选取u的最大值,容易 ...

  9. 虚树+树型DP SDOI2011消耗战

    <虚树+树型DP> SDOI2011消耗战 #include <iostream> #include <cstdio> #include <cstring&g ...

最新文章

  1. 操作系统实验之作业调度算法
  2. oracle无法删除app文件,DG-主库删除日志备库无法应用-求解决办法
  3. 内置函数---filter和map
  4. 二维数组各行分别求和_【PyTorch入门】之十分钟看懂二维卷积层的运算、实现及应用...
  5. Properties文件的XML格式
  6. instagram技术_Instagram9位科技女孩进行技术采访的主要技巧
  7. Spark的枚举类型实例!scala的枚举。
  8. LVS_Cluster
  9. AD9361 补充(中)
  10. 火狐浏览器不支持html5,解决火狐浏览器扩展版本不兼容问题
  11. 总结jQuery中的DOM节点属性
  12. 通信专业实务(三)——接入网
  13. 端云协同,打造更易用的AI计算平台
  14. PC端滚动加载更多的实现方法
  15. norflash的操作
  16. 【ORACLE】21版本新特性之SQL宏(SQL MACROS)的分析
  17. selenium操作无界面chrome浏览器
  18. 将markdown标记换成html标签,Markdown常用标记
  19. 深度学习环境配置之windows下的torch-gpu=1.7.1(亲测有效)
  20. 软件测试技术工程师面试这些离职原因不能说!

热门文章

  1. 帝国CMS标签 总结2
  2. dispatch_after中时间的计算
  3. Codeforces 120F Spiders
  4. 通过关闭UseDNS和GSSAPIAuthentication选项加速SSH登录
  5. 教你做炫酷的蜂巢式图片墙
  6. TopFreeTheme精选免费模板【20130703】
  7. Java学习日志(四)
  8. 在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录...
  9. 实现在线用户列表的简单方法
  10. (62)Verilog HDL模块例化system Verilog模块