ssoj3130: 流浪者(rover)

时间限制: 3 Sec 内存限制: 256 MB O2
提交: 53 解决: 22
[提交][状态][博客][加入收藏]
题目描述
有一位流浪者正在一个n∗m的网格图上流浪。初始时流浪者拥有S点体力值。
流浪者会从(1,1)走向(n,m),并且他只会向下走或是往右走,在所有可行的路线中他会随机选择一条。网络图中还有K个障碍点。若流浪者当前体力值为S,则他经过一个障碍点后体力值会变为⌈S/2⌉。
现在请你求出,流浪者到达(n,m)时他体力值的期望是多少。若答案为ab,则你输出ab在模10e9+7意义下的值即可。n,m<=1e5,k<=2e3,
题解:
考场思路:先考虑暴力,对于这种后面点的状态可由前面点转移而来的问题,当然考虑DP了,记f[i][j]为到达(i,j)的期望,转移显然;然而一开始没有注意到它要取上整,打完后才发现样例不对,那怎么办呢?很显然,S被除log次后会恒为1,所以对于被除以几次后的值记录一下,状态多记一个经过多少障碍点,反正也就一个log,没记到的都按1算,数组压掉一维即可。然而样例竟还是不对,这时才发现他是在所有可行路线中随机选取一条,故DP记的应是方案数,记完后再除以总方案数即可,效率O(NMlongK)。于是在费劲千辛万苦后拿到了50分的暴力分。。。(以后一定要先模一下样例再写题啊)。
之后,考虑正解,发现对答案由影响的只有障碍点,因此记f[i][j]为到第i个障碍点,经过j个障碍点的方案数。如果直接从上一个障碍点转移,则它可能经过其他障碍点,还要算它到当前障碍点不经过其他障碍点的方案数,这也不好算。故考虑其他做法:先不考虑障碍点的问题,则路径数易求得,加上障碍点的限制,考虑减掉障碍点数不为j的:若小于j,直接减去已经计算过的f[i][k] (k<j);若大于j,因为在f[i]中没有记录它的,又没法直接算,故考虑从前面找,但要找那些呢?考虑他们的共同性质:经过节点数大于j,则经过第j个节点时,他们都在i前的一个关键点,故减去所有i前(横纵坐标均小于i)的关键点的f[k][j]即可,这样一定保证每个经过关键点数大于j的路径有且仅被算一次,因为他们在经过j个关键点后的位置是唯一确定的。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值