ST演算法 區間最值問題 C 實現

2021-10-09 11:20:25 字數 963 閱讀 6208

//區間最值

void

st_prework

(vector<

int>

& a,

int n)

}}

當查詢任意區間[l, r] 的最值時,我們先計算出乙個k,滿足2^k< r-1 <= 2k+1,也就是使2的k次冪小於區間長度的前提下最大的k。那麼「從l開始的2k個數」和「以r結尾的2^k個數」這兩段一定覆蓋了整個區間[l, r],這兩段的最大值分別是dp[l, k]和dp[r-2^k+1, k],兩者中較大的那個就是區間[l, r]的最值。因為求得是最大值,所以這兩段只要覆蓋區間[l, r]即可,即使有重疊也沒有關係。

//查詢l-r區間的最值

intst_query

(int l,

int r)

#include

#include

#include

#include

#include

using

namespace std;

//st演算法(區間最值問題)

int dp[

1000][

1000]=

;//區間最值

void

st_prework

(vector<

int>

& a,

int n)}}

//查詢l-r區間的最值

intst_query

(int l,

int r)

intmain()

st_prework

(arr, n)

;//cout << endl;

int l, r;

while

(cin >> l >> r)

}

st演算法模板(區間最值)

f 1,0 表示第1個數起,長度為2 0 1的最大值,其實就是3這個數。f 1,2 5,f 1,3 8,f 2,0 2,f 2,1 4 從這裡可以看出f i,0 其實就等於a i 這樣,dp的狀態 初值都已經有了,剩下的就是狀態轉移方程。我們把f i,j j 1 平均分成兩段 因為j 1時,f i,...

求解區間最值的ST演算法

作用 st演算法是用來求解給定區間rmq的最值,本文以最小值為例 舉例 給出一陣列a 0 5 則區間 2,5 之間的最值為1。1 離線預處理 運用dp思想,用於求解區間最值,並儲存到乙個二維陣列中。具體解釋 1 離線預處理 st演算法使用dp思想求解區間最值,貌似屬於區間動態規劃,不過區間在增加時,...

ST表演算法(求解區間最值)

如下 bin 0 1 for int i 1 i 20 i bin i bin i 1 2 bin i 表示2的i次方 log 0 1 for int i 1 i 200000 i log i log i 2 1 log i 表示log i for int i 1 i n i mn 0 i a i ...