vijos 1002 过河(一类压缩长度的DP)

地址:https://vijos.org/p/1002

题意:一条直线上有m个点,青蛙一次能跳的长度为s~t,每个点的坐标范围1~10^9,1<=s<=t<=10

分析:这题一下子就能想到简单的DP,f[ i ] =min{ f[ j +k ] }+w  (s<=k<=t, w为i坐标是否有石子),这样的复杂度是O(L*t)的,主要时间都在L上,由于石头数m比较少,我们应该会发现,实际上有许多石头相隔很远,这之间的状态一直都是相同的,所以没必要全部考虑,而是直接跳过,我们可以将这座桥分段,每段为石子加上它两端的t个坐标,如果两个石子太近,就把他们和起来成为一段,这样最多只有m段,现在需要更新的状态只有相邻两段之间的状态转移,还有本段自身的转移,本段自身的转移方程很简单,就是上面的方程,而两段之间的转移复杂一点,就是前一段的后t个坐标和,当前段的前t个坐标,注意这里只能取t个才能保证之间没有石子,这也是状态不改变的前提,现在就是枚举前面t个到当前t个是否可达了,可达就更新,在这里我郁闷了好久,数论功底太弱= =,现在总结一下:

坐标i到j是否可达,也就是x*s+y*t = j-i+1,这个式子不就是典型的二元一次不定方程ax+by=c

一般的不定方程我们只求出可行解就行了,而这里我们需要的是非负解,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值