RMQ算法入門(dp)

在開始學LCA的時候,看別人的博客,知道了RMQ這個算法,在學LCA的時候會用的到,於是我就先把這個算法給學了,一百度,原來RMQ算法實現的功能,和線段樹差不多,還有這個算法也是dp,dp無處不在啊,

RMQ(Range Minimum/Maximum Query),即區間最值查詢,是指這樣一個問題:對於長度爲n的數列A,回答若干詢問RMQ(A,i,j)(i,j<=n),返回數列A中下標在i,j之間的最小/大值。這兩個問題是在實際應用中經常遇到的問題,下面介紹一下解決這兩種問題的比較高效的算法。當然,該問題也可以用線段樹(也叫區間樹)解決,算法複雜度爲:O(N)~O(logN),這裏我們暫不介紹。
這個算法怎麼實現的呢,其實本質上我感覺和線段樹實現的而功能差不多,

這裏我們都直接當最大值求了哈,其實最小值也一樣。

我們先定義一個數組,dp[i][j],i代表的意思是從數組的第i個位置開始,j代表的是長度爲2^j,所以dp[i][j]帶表的意思就是數組的a[i]~a[i+2^j-1]    的最大值,這個數組的初始狀態應該是什麼呢,就是dp[i][0]=a[i],

剛開始我們可以先求長度爲1的最大值,然後我們可以根據長度爲1的最值求長度爲2的,再求長度爲4的,再求長度爲8的,依次類推,

dp[i][j]    的長度一定是偶數,(這個很容易知道吧,這裏就不證明了,)既然他是偶數那麼我們就可以把這個dp[i][j]所表示的序列從中間給一分兩半,那麼句變成了

dp[i][j]  =  max  (  dp[i] [j-1] ,  dp[i+(1<<(j-1))]  [j-1])

這個式子就是這個算法的精華所在,一定要把這個式子給理解了,

現在等於說預處理我們處理好了,然後我們就需要開始查詢了,

查詢其實也很簡單的,你想一下,不管你給的任何區間,只要我們用兩個dp表示就一定可以表示出來的

例如你要求   [l , r] 這個區間的最大值,

k=int(  (log2)  (r-l+1)  )

sum=max(dp[l][k] , dp[r-(1<<k)+1]  [r]   )

這就是查詢了,

下面給一道題具體的練習一下吧,

poj3264

這道題就是典型的RMQ算法的例題,當然用線段樹也可以解,不過代碼量也有點複雜,

下面給出AC代碼,

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
#define met(A,AA) memset(A,AA,sizeof(A))
const int maxn=50004;
int maxsum[maxn][20];
int minsum[maxn][20];
int n;
void B()
{
    for(int j=1;j<20;j++)
    {
        for(int i=1;i<=n;i++)
        {
            if((i+(1<<j)-1)>n) break;
            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]);
        }
    }
}
int main()
{
    int t,r,l;
    met(maxsum,0);
    met(minsum,0);
    scanf("%d %d",&n,&t);

    for(int i=1;i<=n;i++)
    {
        scanf("%d",&maxsum[i][0]);
        minsum[i][0]=maxsum[i][0];
    }
	 B();
    while(t--)
    {
        scanf("%d %d",&l,&r);
        int k=int((log(r-l+1.0))/log(2.0));
        int MAX,MIN;
        MAX=max(maxsum[l][k],maxsum[r-(1<<k)+1][k]);
        MIN=min(minsum[l][k],minsum[r-(1<<k)+1][k]);
        printf("%d\n",MAX-MIN);
    }
    return 0;
}










 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章