首先,很容易想到Dp。设f[i][0]表示第i个栅栏走左边的最短路,f[i][1]表示第i个栅栏走右边的最短路。
所以,我们要找一个刚好在第i个栅栏的左右边界下面的栅栏。如图所示:
则有:
f[i][0] = min(f[k][0] + |Left[i] - Left[k]| , f[k][1] + |Left[i] - Right[k]| )
f[i][1] = min(f[j][0] + |Right[i] - Left[j]| , f[j][1] + |Right[i] - Right[j]| )
那么,该怎样求k和j呢?
很容易想到开一个数组,从小到大覆盖。但这样的时间复杂度是O(n^2)的。用线段树区间修改,单点查询就可以了。
附上程序:
#include #include #include #include #include #include #include #include #include #include #include