学了二维决策单调性优化。
把整个矩形从中间劈开,使用线段树维护。
设f[l][r]为第l行->第r行的最短路径。可以发现f[l][r]的决策点(中间的点)随着l,r的递增而递增。
原因是考虑路径。路径一定是不会交叉的,否则调整一下就会更优。
有一种分治法可以求出,就是像一维决策单调性优化一样。但是多一个log
然而这道题可以使用二维决策单调性优化。
设p[l][r]表示[l,r]的决策点,则p[i-1][j]<=p[i][j]<=p[i][j+1]
这样子把决策限定在了一个区间。
实际上差分一下发现这样子时间复杂度是p[n-i+1][n]-p[1][i]这n个求和,这n个每部分都不会超过n,所以时间复杂度是O(n^2)
但是这样子空间太大。在长度较小的时候可以使用另外一种dp
设f[i]表示到第i个位置的最短路,p[i]表示到上一行这个位置的最短路。
则f[i]=min(g[j]+abs(s[i]-s[j])),后面的是路径1~i的前缀和。
把后面的绝对值拆开根据大小分类讨论,维护一个前/后缀min即可。
这样子附加空间只有O(n)。就能过这道题。