wombats

学了二维决策单调性优化。

把整个矩形从中间劈开,使用线段树维护。

设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)。就能过这道题。

原文地址:https://www.cnblogs.com/cszmc2004/p/12983363.html