淺談二維RMQ


         針對一些二維區間最值問題,用一維RMQ來解決顯然是不夠的。所以,要改進算法。鑒於網上沒有PASCAL版的RMQ標程與解析,所以小可在這里簡單的講一下。

   核心思想和一維的一樣,只是在計算區間時略有不同。用數組F[i,j,k]表示以i,j為左上角的矩形,長度為(1 shl k),然后在循環時取四個矩形的最值,具體偽代碼如下:

  for k:=1 to x do              // x為要處理矩形的最大邊長的trunc(logmax)值
    for i:=1 to n+1-(1 shl k) do
      for j:=1 to m+1-(1 shl k) do      //循環上和一維的一樣,只是多加了一層而已 
       f[i,j,k]:=max(f[i,j,k-1],f[i+1 shl (k-1),j,k-1],f[i,j+1 shl (k-1),k-1],f[i+1 shl (k-1),j+1 shl (k-1),k-1]);

           //   分成四塊正方形計算

  查詢時和一維的一樣,這里不再詳講。

  總的時間復雜度為O(logN*N+M)  在這里將待處理矩形看做正方形,M為詢問次數

  提別提醒:因為循環次數較多,反復調用shl函數會導致常數變大,所以有時可以開一個數組預存要用到的值,以減少時間上的浪費。

 

  "理想的正方形"就可以用以上方法完美的解決掉,時間略慢,附上代碼

AC代碼:

program zht;

var n,m,s,x,i,j,k,q,w,ans:longint;

f1,f2:array[0..1000,0..1000,0..7] of longint;

z:longint;

function mm(a,b:longint):longint;

begin if a>b then mm:=a else mm:=b;

end;

function max(a,b,c,d:longint):longint;

begin

max:=mm(mm(a,b),mm(c,d));

end;

function mmm(a,b:longint):longint;

begin

if a<b then mmm:=a else mmm:=b; end;

function min(a,b,c,d:longint):longint;

begin

min:=mmm(mmm(a,b),mmm(c,d));

end;

begin

assign(input,'square.in');

assign(output,'square.out');

reset(input);

rewrite(output);

readln(n,m,s);

for i:=1 to n do

 for j:=1 to m do

  begin

  read(z);

  f1[i,j,0]:=z;

  f2[i,j,0]:=z;

  end;

x:=trunc(ln(s)/ln(2));

for k:=1 to x do

 for i:=1 to n+1-(1 shl k) do

  for j:=1 to m+1-(1 shl k) do

  begin

  f1[i,j,k]:=max(f1[i,j,k-1],f1[i+1 shl (k-1),j,k-1],f1[i,j+1 shl (k-1),k-1],f1[i+1 shl (k-1),j+1 shl (k-1),k-1]);           f2[i,j,k]:=min(f2[i,j,k-1],f2[i+1 shl (k-1),j,k-1],f2[i,j+1 shl (k-1),k-1],f2[i+1 shl (k-1),j+1 shl (k-1),k-1]);

  end;         // 兩個存最值的數組預處理

ans:=maxlongint;

for i:=1 to n-s+1 do

 for j:=1 to m-s+1 do

 begin

 q:=max(f1[i,j,x],f1[i+s-(1 shl x),j,x],f1[i,j+s-(1 shl x),x],f1[i+s-(1 shl x),j+s-(1 shl x),x]);

 w:=min(f2[i,j,x],f2[i+s-(1 shl x),j,x],f2[i,j+s-(1 shl x),x],f2[i+s-(1 shl x),j+s-(1 shl x),x]);

 ans:=mmm(q-w,ans);     // 窮舉頂點,計算最小差值

 end;

writeln(ans);

close(input);

close(output);

end.


     <Marvolo原創,嚴禁轉載>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM