[NOI2005]瑰丽华尔兹
朴素的动规很好考虑,f[i, x, y]表示第i个时间段结束的时候在(x, y)位置的最大滑动距离。那么就有朴素方程:
f[i, x, y] = max{ f[i-1, x+s, y] + s } (d[i] = 1) max{ f[i-1, x-s, y] + s } (d[i] = 2) max{ f[i-1, x, y+s] + s } (d[i] = 3) max{ f[i-1, x, y-s] + s } (d[i] = 4)
其中s为0到最远滑行距离,也就是min{第i时间段的时间, 障碍物到当前点的距离}
时间复杂度O(knm*最大时间),其中最大时间<=max(n, m)
优化:
考虑d[i] = 1的情况:
f[i, x, y] = max{ f[i-1, x+s, y] + s } (d[i] = 1) = max{ f[i-1, x+s, y] + (x+s) } - x 令g(k) = f[i-1, x+s, y] + (x+s),那么: f[i, x, y] = max{ g(k) } - x
于是我们可以对于同一个i和y的每一个x,维护一个单调递减的队列,每次取出队头-x就是f[i, x, y]的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|