每日总结2021.5.3(补)

1.EscapeHDU - 3533 大意:给定n,m,k,d; 代表需要从(0,0)走到(m,n)。时间限制为d,不管走不走时间都在一秒一秒的增加,每秒最多向东西南北移动一个单位,然后k行,每行给出一个碉堡的射出子弹的方向,发射子弹的周期,子弹的速度,和碉堡的位置(碉堡所在位置不能走)子弹不能穿过某个碉堡,并且只在整数坐标发挥作用。

思路:这道题思路并不难,很容易想到,难在怎么去实现。很容易想到,预处理出某时刻某个点能不能走,然后就相当于有限制条件的bfs,另一种思路是直接bfs,每次判断某点可不可走,第二种思路比较容易实现,但太暴力,太费时,这里我们实现第一种思路。

这题妙就妙在开三维数组来纪录某个点能不能走,因为某个点是可以停留的,对于周期性发射的子弹的位置也不好纪录,直接二维就不太好搞了,但开三维,其中一维纪录时间的话,那就很容易判重了,对于周期性发射的子弹也是如此,只需开三维,纪录在某个时刻某个位置有没有子弹就行了,大大降低了实现难度。(看了大佬的题解,不愧是大佬,代码实现能就是强。)另外就是各种小细节,用偏移量来方便东南西北的操作,先处理出第一个周期的子弹,然后在此基础上加周期就行了。具体就是一点一点的移动,遇到碉堡就停止,如果移动的距离%子弹速度==0,代表子弹能到此位置。然后加周期。

还有就是根据曼哈度距离剪枝,进一步压缩时间。大概就这么多,完毕。

总结:时间在一直变化,想到开三维纪录,整个题目就清晰了。

2.DNA sequence HDU - 1560 T组样例,每组给定不超过n个的长度1~5的字符串(n<=8),由AGCT组成,找到最短的一个字符串,n个字符串都是它的子序列(不是子串),求最短的字符串的长度。

思路:最短?bfs? 写了,爆内存了。又写了一发dfs,超时了。然后去搜了题解,要用迭代加深,啊,迭代加深太难了。

首先迭代加深适用于搜索深度非常深,但答案明显在很浅的的区域,或者对于搜索深度未知的题目,常用来解决bfs爆内存的问题。迭代加深可以加上启发式搜索就是IDA*,原理和A *类似,在某个深度提前估计最理想状态的情况,如果最理想情况下都超过len则直接结束搜索,len++。那么这道题怎么设计预估函数呢?可以开一个数组,记录n个字符串每一个匹配到了哪个位置,对于每个字符串还需要的长度是该字符串的长度-已经完成匹配的长度,最理想的情况只看最大的那个。那如何判断是否该len成功了呢,还是看那个记录匹配位置的数组,如果对于所有的字符串,字符串长度-完成匹配的位置==0,那么证明所有的字符串都是子序列了。完毕。

总结:迭代加深和bfs有点像,主要用来解决bfs爆内存的问题。注意把每个字符串的长度先提前求出来和字符串一块存到结构体里,不然会超时。

3.Nightmare Ⅱ HDU - 3085 T组测试样例,每组给定一个n*m的迷宫,‘M’代表小M的位置,‘G’代表小G的位置,‘Z’代表鬼,‘X’代表墙,其中鬼无视墙的影响。小M每秒可以走三步,小G每秒可以走一步,鬼每秒可以分身将周围曼哈顿距离小于等于2的位置占据,之后分身同本体一样,直至将迷宫全部占满。每次可以看做鬼先扩展,然后人移动,求小M和小G汇合的最短时间。

思路:之前做过一道咖啡厅汇合的最短路径,以为这题和那道题差不多,直接双向bfs,然后走上了wa的不归路。仔细想想,两道题还是有区别的,为什么呢,最短路径就是简单的将两人走的距离想加就行了。但是最短时间不行,两个人是两个独立的个体,在每一秒两个人走迷宫都是同时进行的。因此不能按照最短距离的方式区别扩展。那该怎么扩展呢?按照时间一层一层的扩展,甚至不需要开d数组,因为不管怎么时间都是每次加一。只需开st数组,纪录有没有被走过,被谁走过就行了。对于小M,每秒走三步,其实就是扩展三次就行了,注意是一层一层的扩展。另外对于某个点能不能走不需要提前预处理,只需要根据距离鬼原始位置的曼哈顿距离就行了,并且每次都是鬼先扩展,所以在次时间增加后先判断出队的位置合不合法,合法之后才用它去扩展。

总结:对于最短时间的双向bfs,由于时间和距离本质的不同(时间和距离维度不同,哈哈,这是个物理问题。)决定了其不能用原始的双向bfs去搜索。而是根据时间去逐层搜索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值