Difficulty: 3.5 / Easy
Tag: -
首先有个朴素的 DP:dp[i]=minj=stdp[i−j]+[i∈A]dp[i]=\min_{j=s}^t dp[i-j]+[i\in A]dp[i]=minj=st dp[i−j]+[i∈A]。
但是注意到如果石头间间隔很远,可以随便跳,前面的石头位置已经不影响后面怎么跳了。
这个距离大概是多少呢?
根据小凯的疑惑,在 ab−a−b+1ab-a-b+1ab−a−b+1 及以后的数都可以用 ax+byax+byax+by 表示。所以如果 t−s≥1t-s\ge 1t−s≥1,且 [l,r][l,r][l,r] 没有石头,从 [l,r−s(s−1)][l,r-s(s-1)][l,r−s(s−1)] 间所有点都可以跳到 rrr。所以这个距离设置成 2s(s−1)+t2s(s-1)+t2s(s−1)+t 是完全够用的。
这样 DP 总长度就缩小到 O(ns2)O(ns^2)O(ns2) 了。复杂度为 O(ns3)O(ns^3)O(ns3)。
当然,你可以通过 (min,+)(\min,+)(min,+) 矩阵乘法等方式求出距离为 1∼2s(s−1)+t1\sim 2s(s-1)+t1∼2s(s−1)+t 的 DP 长什么样,优化成 O(s5+ns2)O(s^5+ns^2)O(s5+ns2) 或 O(s3logs+ns2logs)O(s^3\log s+ns^2\log s)O(s3logs+ns2logs) 之类的。但 nnn 这么小,感觉也没啥必要优化。
注意特判 s=ts=ts=t 的情况。
时间复杂度:O(ns3)O(ns^3)O(ns3)。