看了点代码,只会空间复杂度N^logN的,这个就是递推,以下摘自飘过的小牛的博客
void RMQ(int num) //预处理->O(nlogn)
{
for(int j = 1; j < 20; ++j)
for(int i = 1; i <= num; ++i)
if(i + (1 << j) - 1 <= num)
{
maxsum[i][j] = max(maxsum[i][j - 1], maxsum[i + (1 << (j - 1))][j - 1]);
minsum[i][j] = min(minsum[i][j - 1], minsum[i + (1 << (j - 1))][j - 1]);
}
}
,只是因为求的是极值所以可以区间重叠。,所以比如说我要求【1,100】的最小值,那么我求出【1,50】和【50,100】
的最小值来取min()得出所求解,和求【1,80】,【20,100】的最小值取min的效果是一样的(因为在固定区间里极值是固定的)所以并不用严格要求,只需要把所求区间完全覆盖,那么可以存在子区间的选择空间。
void RMQ(int L,int R) //查询
{
int k=(int)(log(R-L+1.0)/log(2.0));
Rmax=max(dp[L,k],dp[R-(1<<k)+1][k]);
Rmin=min(dp[L,k],dp[R-(1<<k)+1][k]);
}
然后问题来了,如果数据在百万级我的二维数组就完全开不下了。。
求高手指点。
求高手路过留言。
3Q。