二分问题-捉老鼠

在n×m的迷宫中,通过预处理和二分搜索法求解最多能抓到的老鼠数量。算法利用BFS计算点对最短距离,通过动态规划优化,将决策数量降至O(mn),降低时间复杂度至O(plogp+m2n2+pmnlog(pmn)),空间复杂度O(p+m2n2)。
摘要由CSDN通过智能技术生成

捉老鼠


Description

我来到一个n×m(n,m<=10)的迷宫中。
迷宫里有空地,也有石头。
空地用”.”表示,石头用”#”表示,而我所在的位置用”L”表示。
每一单位时间,我可以向上、下、左、右四个方向移动一个单位,也可以停在原地。
空地里有一些时刻会出现老鼠,假如在那一个时刻,我恰好呆在那个格子里,我就可以抓到那一只老鼠。
我最多可以抓到多少只老鼠?


Input

第一行n和m,以后n行,每行m个字符,表示迷宫。
然后一个整数p(p≤30000),代表老鼠个数。
以后p行,每行3个数,分别是老鼠的坐标和老鼠出现的时刻(时刻在2^31-1以内)。
初始时刻为0。


Output

一个整数,代表最多能捉到的老鼠个数。


Sample Input

5 5
L....
..#..
###.#
#....
#.###
4
2 2 2
2 1 3
5 2 13
5 1 14

Sample Output

3

HINT

本题的坐标,是以迷宫的右上角为(1,1),最上面一行从右往左第二个为(2,1)。
数据范围见题面。


Solution

预处理将所有老鼠按照出现时间排序,并用BFS求出所有点对之间的最短距离dist[ x1,y1,x2,y2 ]。
假设排序后第i只老鼠的坐标为(x[i],y[i]),出现的时间为time[i]。
如果用f[i]表示前i只老鼠中,第i只一定要捉,最多能捉到几只老鼠,容易得到以下的状态转移方程:
f[i]=max{ f[j]+1}(j=1i1,time[j]+d[i,j]time[i])
其中d[i,j]表示第i只老鼠坐标到第j只老鼠坐标的距离值。这个算法的时间复杂度为 O(p2) ,对于p≤30000的范围来说略大了一些。
这个算法是否存在优化的余地呢?
经过仔细分析,我们发现每一个状态f[i]的决策数目为 O(p) 级别。
而如果我们从格子的角度考虑,总共只有

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值