学习心得——day1

今天是参加讲授的第一天。上午主要学习了一部分的DP选讲和线段树的运用,下午是练习测试。这里将今天所学的知识点做一个清理和总结消化。

上午 - DP选讲

Part 1

酱神寻宝(CDOJ1141)

题意:

酱神来到了一座小岛,岛上有n个箱子。

一共有3中不同的钥匙,金钥匙、银钥匙和万能钥匙。酱神一开始有a把金钥匙、b把银钥匙和c把万能钥匙。

第i个箱子上有xi把金锁,yi把银锁。金钥匙只能打开金锁,银钥匙只能打开银锁,万能钥匙两种锁都能打开。用于打开锁的钥匙会立刻损坏,酱神会丢掉损坏的钥匙。箱子里有ai把金钥匙、bi把银钥匙和ci把万能钥匙,想要取出箱内的钥匙必须要打开这xi+yi把锁。

酱神的目的是使他拥有的钥匙总数最多。一旦酱神认为自己已经拥有了最多的钥匙,他就不会去开剩下的箱子了。

思路:

金钥匙和银钥匙都具有指定性,只能打开特定的锁。所以在相同的情况下,我们尽可能地保留万能钥匙(贪心策略)。

则将这个策略运用于DP,我们定义状态为 dp[st][j] 。st是一个二进制数,利用状压保存了箱子的状态,1表示该位对应的箱子已经打开,0表示还没有打开。j保存的是当前酱神持有的金钥匙的数目。dp储存了当前酱神持有的最多的万能钥匙的数目。而银钥匙可以通过金钥匙数目、万能钥匙数目和st的状态计算得到。

每次状态转移时,从st中枚举当前为零的位数(宝箱编号),依次置一,从而得到新状态。

Part 2

Where is Bob(HDU5208)

题意:

Alice从[l1,r1]中选出一个数字x,JSL看到这个数字之后从[l2,r2]中取出一个数字y(y可能和x相同)。最后他们计算出数字z=x⊕y(⊕为异或运算)。Alice希望z尽可能大,而JSL希望z尽可能小。Alice和JSL都很聪明,那么z最后会是多少?

PS:如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

思路:

游戏存在明显的先后顺序,Alice已知JSL是会尽可能地选一个数使z变小。所以我们可以想出暴力程序:首先枚举 i ,表示Alice能选择的数 ( l1 ≤ i ≤ r1 );而后枚举 j ,表示JSL能选择的数( l2 ≤ j ≤ r2 )。则每次在(r2 - l2)个 j 中选出能使z最小的 j (此处模拟了JSL的选择),然后在(r1 - l1)个 i 中确定出能使z最大的 i (Alice的选择)。从而得到要求的z。

不过这么做,复杂度很高,是O(n²)。

正解是DP,利用位运算。每次从高位决策(因为高位比低位权重更大,即在高位置一、低位全置零的效果大于高位置零、低位全置一),分别缩小两人所选的数的上下界。定义dp[i][l1][r1][l2][r2] ,i 表示当前操作到了第 i 位,l1 和 r1 分别是Alice能选择的数的下届和上届,l2 和 r2 分别是JSL能选择的数的下届和上届。dp中储存了最后的价值z的具体值。

状态转移时,每次逐位决策。首先是Alice拥有主动权,如果上下界允许,我们的第 i 位可以在0和1中决策(即Alice通过对JSL的选择的预测决定自己选择的最优(即z最大))。

如果选1,则上界的所有比 i 低的位数全部置零;反之,如果选0,下届所有比 i 低的位数全置一。这样可以不断缩小上下界的范围。而后轮到JSL,JSL会尽可能地选择与Alice不同的数,则我们对他的上下界也进行相同的操作。直到最后经过末位,得到确定的上下界和z的值(即dp[0][l1][r1][l2][r2]的值)。

Part 3

酱神的旅行(CDOJ1140)

题意:

酱神要去一棵树上旅行。

酱神制定了一个旅行计划,他要按顺序去m个树上的结点,a1,a2,a3,...,am。

酱神有一辆车,树上的每一条边既可以开车通过,也可以走过去,两种方法需要不同的时间。如果选择走路,酱神需要先把车停在结点上,在他下一次要开车的时候,必须先回到停车的结点取车。

酱神和他的爱车一开始都在a1结点上,酱神要依次访问完这m个结点最少需要多少时间。

思路:

首先这题看上去像是一道树形DP,似乎需要按照树的路径进行遍历。但实际上需要去的节点的顺序是规定了的,也就说酱神的旅行是有规定的路径的。所以先暴力dfs将路径求出来,保存在数组中,再到数组里进行DP。

定义状态dp[i][j], i 表示当前酱神在第 i 个节点,j表示是否有车,dp表示在 i j 描述的情况下的路径最小值。则针对第 i 号节点的更新有两种选择,第一是当前没有车的情况,则dp[i][0] = min(dp[i - 1][0] , dp[i - 1][1]) + walk_cost[i];而当前有车的话,又要分两种情况讨论,一种是当前有车是有 i-1 开车到达 i 节点(dp[i][1] = dp[i - 1][1] + car_cost[i]),另一种是之前没有车到达 i 节点时捡到了车。针对捡到了车的情况,能在 i 捡到车,一定是在之前将车停在了与i相同的点上,而且该点一定在i-1的根节点上,但是经过的与i相同的点可能有多个,我们将其记为j1,j2,j3……jk。则我们可以维护一个前缀和sum[i],表示走路到前第i个点的代价。则有dp[i][1] = min (dp[jk][1] + sum[i] - sum[jk])

时间: 2024-11-05 18:30:04

学习心得——day1的相关文章

学习JAVA Day1

为了个人兴趣,和今后出路,开始学JAVA了. 仔细想想,其实没有系统学过编程课.都是自己看文章学的.在网上找来一个<黑马程序员 毕向东 Java视频教程> 来学学试试. 心得: 1. 包含关系 JDK>JRE>JVM 2. Java有3中注释方式,单行//, 多行 /**/, 文档/** ... */ 文档是特有的.注释可以用来debug 3. 学习JAVA Day1

Linux系统理解以及Linux系统学习心得

原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Linux系统的理解 1.加载Linux内核准备:在加载基本输入输出模块(BIOS)之后,从磁盘的引导扇区读入操作系统的代码文件块到内存中,之后开始整个系统的初始化. 2.main.c的start_kernel函数是整个操作系统的入口,这也与Linux是基于C语言的特性相符,start_kernel具体做的动作很多

我的MYSQL学习心得(八)

我的MYSQL学习心得(八) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL学习心得(六) 我的MYSQL学习心得(七) 这一篇<我的MYSQL学习心得(七)>将会讲解MYSQL的插入.更新和删除语句 同样的,只会讲解跟SQLSERVER不同的地方 插入 将多行查询结果插入到表中 语法 INSERT INTO table_name1(column_list1) SELECT (

我的MYSQL学习心得(一)

我的MYSQL学习心得(一) 使用MYSQL有一段时间了,由于公司使用SQLSERVER和MYSQL,而且服务器数量和数据库数量都比较多 管理起来比较吃力,在学习MYSQL期间我一直跟SQLSERVER进行对比 第一期主要是学习MYSQL的基本语法,陆续还有第二.第三.第四期,大家敬请期待o(∩_∩)o 语法的差异 我这里主要说语法的不同 1.默认约束 区别:mysql里面DEFAULT关键字后面是不用加括号的 --sqlserver CREATE TABLE emp ( id INT DEFA

Linux学习日志day1——无人值守系统安装DHCP+TFTP+PXE+Kickstar

Linux学习日志day1--无人值守批量系统远程网络安装(DHCP+TFTP+PXE+Kickstar)                                         --作者:江信瀚 服务器环境介绍: 主机名:workstation.example.com 关闭SElinux以及防火墙 虚拟机:VMware(关闭了VMware的DHCP服务) 网卡配置: 静态IP获取! IPV6全部都删除,因为根本用不到 子网IP可以在VMware中设置 8.8.8.8是谷歌的DNS服务器

在马哥linux运维学院学习心得

题目:在马哥linux运维学院学习心得 姓名:谭龙 班级:M18 学号:26 时间:2016-02-29--2016-06-02(正常毕业时间预计在7月中上旬)   正文: 个人基本情况: 我是一名在校的即将毕业的大四学生,毕业时间为2016.7.专业为矿物加工工程专业,纯正的四川-广安人(邓小平故居就在那).因找不到工作,加上自己也不知道干什么,在堂弟的推荐下,来参加了马哥linux运维学院的学习:怀揣着一颗对计算机懵懂的心,开始涉足从未接触过了linux. 个人收获与心理变化: 在一开始接触

第一篇大数据学习心得

之前未习惯发布学习心德博文,后续会采用这种方式发布学习心得,希望能够很好的督促自己. 计划会按scala,Hadoop,Spark的顺序去学习. 刚学scala的时候,眼前一亮,这语法跟python,java很像啊,刚好两者很熟悉,偷笑,后面果然学的得心应手.今天就不发表具体的技术内容.反正王学林老师的视屏讲解很好,声音非常富有感染力,想开小差都比较难,呵呵,话语精炼,个人较喜欢的风格,这里说下这段时间学习scala的小心得?,视频学完一章紧接着进行敲代码,调试,最后记笔记,对,记笔记,不一定是

spring核心知识(学习心得)

直接进入主题,主要分为两大部分:框架学习心得和spring框架的核心知识. 学习心得 1.学习框架的时候,一定要弄清楚的几个问题: a. 这是一个什么框架 轻量级还是重量级, 侵入式还是非侵入式,是解决单个问题还是整体的解决方案. b. 框架的设计理念是什么(为了解决什么问题而出现) c. 框架的优缺点 d. 框架的架构是怎样的 e. 框架的核心是什么 f. 框架能实现哪些功能 在学习一个框架的时候如果都不知道它能够提供哪些功能,就更加不用谈功能实现和充分利用框架了 2. 在学习多个框架以后,如

C++用法的学习心得

c++这门课,在我刚进入大学的就已经开始接触了.因为自己的专业就是计算机科学,因此c++嘛,对于我来说还是比较重要的.不同于其他专业,一开始我接触就是c++了,跳过了c语言一类的课.就我自己认为,c++这课学起来还是很有难度的.大一上课的时候,老师就说过这课在生活中的应用很广泛.处于初学者的我,开始给我的感觉就是很是乏味枯燥,提不起兴趣.不过仔细想想自己的专业就是和它有关,就算将来自己不从事这个行业,还是很有学习它的必要.因为多一门技术总归是不会吃亏的. 作为男生嘛,自己没有少玩游戏.很多人玩游