rmp演算法詳細介紹 poj3264

2021-05-22 20:23:38 字數 1600 閱讀 1505

rmq(range minimum/maximum query)問題:

rmq問題是給定乙個區間,求這個區間中的最大或最小值的問題

rmq採用動態規劃的思想來求解:(

st演算法:

square table):

預處理:

預處理使用

dp的思想,

f(i, j)

表示[i, i+2^j - 1]

區間中的最小值。

例如,f(0, 0)

表示[0,0]

之間的最小值,就是

num[0], f(0, 2)

表示[0, 3]

之間的最小值

, f(2, 4)

表示[2, 17]

之間的最小值

注意,

因為f(i, j)

可以由f(i, j - 1)

和f(i+2^(j-1), j-1)

匯出,

而遞推的初值

(所有的

f(i, 0) = i)

都是已知的

所以我們可以採用自底向上的演算法遞推地給出所有符合條件的

f(i, j)

的值。查詢

:假設要查詢從m到

n這一段的最小值

, 那麼我們先求出乙個最大的k, 使得k

滿足2^k <(n - m + 1).

於是我們就可以把

[m, n]

分成兩個

(部分重疊的

)長度為

2^k的區間

: [m, m+2^k-1], [n-2^k+1, n];

而我們之前已經求出了

f(m, k)

[m, m+2^k-1]的最小值

, f(n-2^k+1, k)

[n-2^k+1, n]的最小值

我們只要返回其中更小的那個

, 就是我們想要的答案

, 這個演算法的時間複雜度是

o(1)的.

例如, rmq(0, 11) = min(f(0, 3), f(4, 3))

由此我們要注意的是預處理

f(i,j)中的j

值只需要計算

log(n+1)/log(2)

即可,而

i值我們也只需要計算到

n-2^k+1

即可。例子:

poj 3264找出任意給定區間中,最大值和最小值之間的差

排序演算法詳細介紹

排序的定義 對一串行物件根據某個關鍵字進行排序 術語說明 各種演算法的通俗理解!貪心演算法 從左到右,兩兩互換,每一次最後乙個數總是最大的 選擇排序 從左到右,找到從當前位置開始最小的那個數,然後將當前位置的數與那個最小的數字置互換,直到最後 直接插入演算法 從左到右,該數左邊的序列已經是有序的,如...

詳細介紹匈牙利演算法步驟

這篇部落格介紹了匈牙利演算法的操作步驟,不討論原理。作用解決指派問題。所謂的指派問題就比如 甲乙丙三個人去做abc三件事情。每個人做每件事情所花的時間可能不一樣。每個人只能安排一件事情,問怎樣安排才能使三個人所工作的時間之和最小?擴充套件成 n 個人 n 件事也可以,但要求是 例項 甲乙丙中第i i...

poj 3461 kmp演算法詳細解釋

題目鏈結 kmp演算法已經學過好多次了,但每一次都會忘記,因此打算在這裡藉著這一道模板題記錄下自己對kmp演算法的理解 kmp演算法的核心思想可以理解為 利用目標串自身的資訊,來減少匹配次數提高效率 next陣列的引入 next陣列就是用來幫助利用目標串自身的資訊的。我們這裡定義next陣列表示的是...