前段时间学习了RMQ问题,感觉自己还是太笨了!!!!!
RMQ问题的精髓就在于dp,其实他就是一个dp::::
预处理,复杂度(nlog(n))
void rmq(){
int i,j;
for(i=1;i<=n;i++)
dp[i][0]=a[i];
//dp[i][j]表示从第i个数开始数 1<<j个数,由于1<<0==1;所以dp[i][0]=a[i];
//这样就有了dp[i][j]的初始值:
for(j=1;(1<<j)<=n;j++)
//为啥要从j开始循环呢???
//这个要思考一下!!!!!!
for(i=1;i+(1<<j)-1<=n;i++)
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
//因为是求最小值,所以将它分为1<<(J-1)两段:
}
查询
int ask(int l,int r)
{
int k=0;
/*
while(1<<(k+1)<=(r-l+1))
k++;
也可以用这种方法求k;
*/
k=(int)log(r-l+1)/log(2);
return min(dp[l][k],dp[r-(1<<k)+1][k]);
}
其实也可以用线段树来做,但是有些题用线段树做的话就杀鸡用牛刀了