题意:一条直线上有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
一般的不定方程我们只求出可行解就行了,而这里我们需要的是非负解,