好吧...作为我A掉的第一道单调队列优化dp....在高中生的OJ上....而且我调了一个半小时样例....然后很神奇的1A = =...
诶 这题果断比多校8的1005难啊...min里面的东西这么奇葩的...又 k 又 p 又 j 地...开始我以为只要一个队列, 搞了半天发现应该要N个队列... = =...写出来好神奇....
转移方程什么的详见代码吧....要碎了....
总结下:
形如 d[i] = min(f[k]) 的转移方程( k随i不降, f为可以根据 k 在常数时间内确定的唯一常数 ). 可以采用单调队列优化, 把求min的O(n)时间, 优化到O(1).
具体操作过程一般为:
设 k=[low, high].
1/ 把f[high]丢进deq. (维护deq, 若deq不为空, 先从尾部pop掉不符合单调的元素)
2/ 从首部找元素作为min(f[k]). (元素应满足k的范围, 即序号大于low, 不满足的pop掉).
代码:
#include #include #include #include #include #include #include