poj 1088 滑雪 详解

http://poj.org/problem?id=1088

  这是一道dp入门题,不过我一直没想明白应该怎么dp。今天,在做自己学校oj的算法基础题时看到这题,标注着dp的分类,加上我一直都比较喜欢做dp题,于是我就决心今晚要把这道入门题切了。

  题目是中文的,题目大意就免了吧……

  晚上做dp题的时候,我先是看见类似这题的一维单调增子序列,那题轻松AC了。但是,面对这个我隔了很长时间没想的二维dp题,我想了很久都想不到怎么dp。因为这题在我们学校的oj里是全部计算机专业都要知道怎么做的,所以题目下面有详细的解释,而且觉得那个题解是相当的浅显易懂。

下面是那个解释:

动规算法思路:
f矩阵与原高度矩阵一样大小,f(i,j)表示从(i,j)位置开始滑,可以获得的最大滑道的长度。算法步骤:
(1)将高度矩阵从低到高排序;
(2)按滑点从低到高依次计算最长滑道的长度,存于f(i,j)。
(3)f(i,j)中的最大值即原题所求。

  我依据它的描述以及我对这题的了解,解释一遍:
  我们需要的是一个用来储存原本高度的二维数组,一个用来记忆dp状态的数组,以及一个储存高度以及该高度所在的坐标的结构体数组。先说明一下,我是为了方便自己,所以除了结构体数组外其他两个数组都是开大了的。因为poj的题目中数据是0<=h<=10000,所以我用-1作为图的边界条件,dp数组正常清零。为了方便遍历四个邻接的坐标,所以我定义了四个方向向量。
  
  读入数据的时候,数据要被处理,放到相应的结构类型中。
  然后,在核心处理前,我们的dp需要一个高度单调增大的,但是对应的坐标不会改变。结构体整块的数据移动就可以保留上述预处理的高度块的坐标。这里可以直接用qsort进行对高度的快排。这个预处理是后面dp的关键。
  
  在预处理后,由低到高处理每个高度块所指示的坐标。对于每一个坐标,搜索该坐标周围的dp最大值(dp值的含义是从该点出发,最长可以滑多远),那么被处理的高度块其dp值就是上述最大值加一。然后,为什么可以这样做就是理解整道题的关键。
  可能会有人有这样的疑问,在处理的时候刚开始周围的点不是还没知道dp值吗?为什么也可以直接利用?
  解答这个问题的关键就在于,我们刚开始的时候,dp矩阵已经清零。假设从第一个坐标开始,显然,这个坐标是最矮的高度块所对应的坐标,所以在这周围四块不存在比它矮的那么一块,所以它的dp值是1。同时,我们观察到,这时周围四块的dp值都是0,所以这块必定会变为1。其他的也同理,如果周围存在比当前块高的块,那么这个块肯定是还没被赋值的,也就是默认的0。就是说,当前块无法继承这个比自己要高的块的dp值。此时为0是合理的!
  
  找到所有dp值中的最大值后输出。

  这题我wa了几次,主要是刚开始没想到周围的高度块是允许比当前的大的,所以一个大小符号,导致我浪费了不少时间。
  
下面是我的代码:

View Code
 1 #include "stdio.h"
 2 #include "string.h"
 3 #include "math.h"
 4 #include "stdlib.h"
 5 
 6 #define Reset(a) memset(a, 0, sizeof(a))
 7 #define MAX 1000000000
 8 
 9 int dir[4][2]={{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
10 
11 struct high
12 {
13     int x, y;
14     int h;
15 };
16 
17 int cmp(const void *_a, const void *_b)
18 {
19     struct high a=*(struct high *)_a;
20     struct high b=*(struct high *)_b;
21 
22     return a.h-b.h;
23 }
24 
25 int main()
26 {
27     int n, m;
28     while (~scanf("%d%d", &n, &m))
29     {
30         int h[n+2][m+2], dp[n+2][m+2];
31         struct high rec[n*m];
32 
33         memset(h, 255, sizeof(h));
34         for (int i=1; i<=n; i++)
35             for (int j=1; j<=m; j++)
36             {
37                 scanf("%d", &h[i][j]);
38                 rec[(i-1)*m+j-1].h=h[i][j];
39                 rec[(i-1)*m+j-1].x=i;
40                 rec[(i-1)*m+j-1].y=j;
41             }
42         Reset(dp);
43         qsort(rec, n*m, sizeof(struct high), cmp);
44         int ans=0;
45         for (int i=0, tmp=n*m; i<tmp; i++)
46         {
47             int max=0;
48 
49             for (int j=0; j<4; j++)
50             {
51                 if (max < dp[rec[i].x-dir[j][0]][rec[i].y-dir[j][1]]+1
52                     && h[rec[i].x-dir[j][0]][rec[i].y-dir[j][1]]!=h[rec[i].x][rec[i].y])
53                     max = dp[rec[i].x-dir[j][0]][rec[i].y-dir[j][1]]+1;
54                 dp[rec[i].x][rec[i].y] = max;
55             }
56             if(ans<max)
57                 ans=max;
58         }
59 /**
60         for (int i=1; i<=n; i++)
61         {
62             for (int j=1; j<=m; j++)
63                 printf("%4d ", dp[i][j]);
64             puts("");
65         }
66 /**/
67         printf("%d\n", ans);
68     }
69 
70     return 0;
71 }
 


 
 

转载于:https://www.cnblogs.com/LyonLys/archive/2012/04/27/poj_1088_Lyon.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python find函数_Python 速学!不懂怎么入门python的小白看这篇就够了!

Python是一种非常流行的脚本语言&#xff0c;而且功能非常强大&#xff0c;几乎可以做任何事情&#xff0c;比如爬虫、网络工具、科学计算、树莓派、Web开发、游戏等各方面都可以派上用场。同时无论在哪种平台上&#xff0c;都可以用 Python 进行系统编程。本文讨论基本的 Pyth…

前端开发的盛宴

想写这篇文章由来已久&#xff0c;目的是想回顾一下基于Web技术的开发技术和流程的变迁&#xff0c;以及其背后的原因或规律。我依然记得&#xff0c;很多年前做出来第一个公司网站时的激动心情&#xff08;加班到晚上&#xff0c;兴奋地在空旷的办公室走来走去&#xff09;&am…

datav本地部署 java,Spring Boot对Spring Data JPA的自动配置

一 点睛Spring Boot对Spring Data JPA的自动配置放置在如下路径&#xff1a;二 源码分析1 JpaRepositoriesAutoConfiguration类分析ConfigurationConditionalOnBean(DataSource.class)ConditionalOnClass(JpaRepository.class)ConditionalOnMissingBean({ JpaRepositoryFactory…

解决ssh使用一段时间断开的问题

ssh连接到远程服务器&#xff0c;会在一段时间后自动断开&#xff0c;可以通过调整远程服务器ssh服务的参数解决。以下这个方法通过客户端解决。首先找到所在用户的.ssh目录,如root用户该目录在&#xff1a;/root/.ssh/在该目录创建config文件vi /root/.ssh/config加入下面一句…

靠拿奖学金完成学业后,博士生为女友放弃年薪30万工作选择留校任教

全世界只有3.14 % 的人关注了爆炸吧知识“相恋八年&#xff0c;一路陪伴。研究生毕业后&#xff0c;博士生决定为女友放弃年薪30万的工作选择留校任教&#xff0c;因为曾和女友约定一起当老师。好的科研爱情&#xff0c;或许就是这样携手前进。索长友是哈尔滨理工大学的博士生&…

小菜学设计模式——观察者模式

2019独角兽企业重金招聘Python工程师标准>>> 背景 上一次去看电影院看电影&#xff0c;半旁边的妹子说只要扫一扫就能免费领取爆米花一份&#xff0c;你说我怎么躲得过妹子的招数呢&#xff1f;所以拿起我的手机&#xff0c;扫一扫&#xff0c;注册会员&#xf…

获取 子文件夹 后缀_CSDN学院第一个Ptython Homework-- 递归统计文件夹大小

作业:通过第一周学习的内容,自主编写一个py文件,能够递归文件夹大小,并将统计后的大小进行格式化输出.作业体现形式:以代码的方式保存成后缀为py的脚本.作业的注意事项:1.文件名命名规范.2.注释清晰.3.运行结果符合预期效果 .思路提示:1.使用python内置的os模块来进行文件相关的…

android bitmap drawable 互转

引用&#xff1a; http://www.android123.com.cn/kaifafaq/704.html 很多开发者表示&#xff0c;不知道Android的Drawable和Bitmap之间如何相关转换。下面Android123给大家两种比较简单高效的方法。 一、Bitmap转Drawable Bitmap bmxxx; //xxx根据你的情况获取 BitmapDrawabl…

java 链表逆序 递归,java用递归和非递归实现链表逆序

传统的逆序链表方法是使用三个指针来记录节点的状态&#xff0c;防止链表断裂。Node节点public class Node {private int data;private Node next;public Node(int data){this.data data;next null;}public int getData() {return this.data;}public void setData(int data) …

WeihanLi.Npoi 1.21.0 Released

WeihanLi.Npoi 1.21.0 ReleasedIntroWeihanLi.Npoi 是一个基于 netstandard2.0 的一个 NPOI 扩展库&#xff0c;主要用于导入导出 Excel 以及 CSV&#xff0c;支持通过 Fluent API 的方式来支持非常灵活的导入导出配置&#xff0c;详细使用可以参考文档介绍以及项目示例 https:…

史上最硬核老师:17年间,拿着菜刀把400个混混送进了哈佛耶鲁麻省!

全世界只有3.14 % 的人关注了爆炸吧知识今天&#xff0c;来给大家介绍一位硬核教师Jaime Escalante——手握杰斐逊奖、自由精神奖&#xff0c;拿着菜刀把400个混混送进了哈佛耶鲁麻省。海梅斯埃斯卡兰特(Jaime Escalante)初出茅庐1930年12月31日&#xff0c;Jaime出生于玻利维亚…

钱钱语录

1&#xff09;金钱有一些秘密和规律&#xff0c;要想了解这些秘密和规律&#xff0c;前提条件是&#xff0c;你自己必须真的有这个愿望。 2&#xff09;如果你只是带着试试看的心态&#xff0c;那么你最后只会以失败而告终&#xff0c;你会一事无成。尝试纯粹是一种借口&#x…

数据库表设计

数据库表设计 分析上述各实体的属性集&#xff0c;从中找出关系的主键&#xff0c;然后用关系式来表示实体(其中下划线的属性为主键)。表4-1至表4-5分别给出了主要表结构各实体的属性如下&#xff1a; 表4-1 admin 表名称 主要字段 数据类型 长度 属性 输入方式 描述 …

大数据财税与python应用_大数据跟python

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

php 类中调用另类,PHP return语句另类用法不止是在函数中,return语句_PHP教程

PHP return语句另类用法不止是在函数中&#xff0c;return语句分享下PHP return语句的另一个作用&#xff0c;在bbPress的代码中看到的一个奇葩使用方法。一直以为&#xff0c;return只能出现在函数中&#xff0c;直到看了bbPress的代码:难道 return 还能出现在函数之外&#x…

抓包写代码模拟怎么减少重复劳动

由于工作需要会经常需要Fiddler抓包Chrome F12抓包然后根据抓包写代码来模拟&#xff0c;一般来说我都是先抓包&#xff0c;打开postman把抓来的包放到postman里面模拟请求然后利用PostMan的生成代码功能大部分的Reponse都是Json&#xff0c;为了方反列化接着要打开一个在线工具…

机械史上最复杂的巅峰之作,这才是最强大脑!

全世界只有3.14 % 的人关注了爆炸吧知识今天我们来认识一下机械史上最强大脑&#xff1a;英国数学家查尔斯巴贝奇&#xff0c;他是可编程计算机的发明者&#xff0c;计算机的先驱。他设计过的计算机器有差分机、分析机和第二个差分机。差分机可谓是机械史最复杂的巅峰之作。在英…

X-Scan描述及简单教程

X-SCAN&#xff1a;在对于被动的防御措施设置情况&#xff0c;对于主动漏洞查找目前根据测定&#xff0c;漏洞扫描软件X-SCAN能够对本机及指定IP主机进行网络扫描&#xff0c;能够完成包括端口服务&#xff0c;脚本漏洞&#xff0c;系统服务漏洞等多种扫描情况。能够准确的查找…

模拟 hihoCoder 1177 顺子

题目传送门 1 /*2 模拟&#xff1a;简单的照着规则做就可以了&#xff0c;把各种情况考虑到&#xff0c;虽然比赛写的丑了点&#xff0c;但能1Y还是很开心的:)3 */4 #include <cstdio>5 #include <cstring>6 #include <iostream>7 #include <algorith…

visual studio toolbox 修复

有时visual studio toolbox 中的控件为灰色无法使用。 解决办法&#xff1a;清除缓存&#xff0c;删除所有tbd文件 win xp下 \Documents and Settings\<user directory>\Local Settings\Application Data\Microsoft\VisualStudio\10.0\*.tbdwin 7下 \Users\<user>\…