//區間最值
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 ...