单调队列优化专题

poj1821:这题是一道比较典型的队列优化问题吧,状态方程如下:

dp[i][j]=max(max{dp[i-1][k]+(j-k)*a[i].p},dp[i-1][j],dp[i][j-1]};  第i个人不刷,第i个人刷:第j面墙不刷,枚举所有可能结尾的墙

dp[i][j]表示前i个人刷前j面墙的最大值,且第j面墙必须刷。

这题第一用到了双端队列deque,学习了不少东东啦。

代码:http://blog.csdn.net/qq415200973/article/details/12889811

hdu4374:这题方程还是比较好写的,主要是一些预处理时注意下,还有队列的插入和删除,更新最值要写在一个循环里,因为如果队首的值不能满足当前点的条件,那么它也一定不能满足当前点后面点的条件,就像滑动窗口一样。

dp[i][j]=max{dp[i-1][k1]+sum[i][j]-sum[i][k1-1] , dp[i-1][k2]+sum[i][k2]-sum[i][j-1]};

代码:http://blog.csdn.net/qq415200973/article/details/12905049


你可能感兴趣的:(单调队列优化专题)