st算法介绍

实现过程及原理:首先是预处理用DP解决。设a[i]是要求区间最值的数列,f[i][j]表示从第i个数起连续2^j个数的最大值。例如数列3 2 4 5 6 8 1 2 9 7 f[1][0]表示从第一个数起,长度为2^0个数的最大值,其实就是第一个元素3本身。f[1][2]=5,f[1][3]=8…….从这里可以看出f[i][0]实际就是a[i]。这样dP的初始值就有了,剩下的就是状态转移方程。我们把f[i][j]平均分成两段(因为f[i][j]的值一定是个偶数0),从ii+2^j-1-1为一段,i+2^(j-1)i+2^j-1为一段。用上例说明,当i=1,j=3时就是3 2 4 56 8 1 2这两段。f[i][j]就是这两段的最大值中的最大值。

于是得到f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1]);

求最值,这里求最值的时间复杂度为O(1)

最大值f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1]);

最小值f[i][j]=min(f[i][j-1],f[i+2^(j-1)][j-1]);

原文地址:https://www.cnblogs.com/hpustudent/p/2129995.html