st表,一種高效的區間最值查詢(rmq)演算法。本質其實是乙個動態規劃。
其實吧,對於看過線性dp的人來說應該不難理解,只是處理有些麻煩。但是本土狗因為-1的問題居然改了許久...
用兩個2^i的區間把整個區段覆蓋,dp[i][j]表示區間最值,從i開始,向前2^j個數字。根據動態規劃的定義,把這個區間分割成兩個小區間,於是就有
dp[i][j]=max(dp[i][j-1],dp[i][i+(1一直分割下去,直到1。複雜度o(nlogn)。
於是查詢:
我們找到左右區間大小(y-x+1),把它log一下,再2的次方一下,就成了覆蓋區間的最大2^i次方的區間。同理,右區間也是。比較兩區間最值,就可以得出最值了。
code:
#include#include模擬線段樹:using
namespace
std;
const
int maxn=100005
;int n,m,a[maxn],dp[maxn][25
],l[maxn];
intmain()
l[0]=-1
;
for(int i=1;i<=n;++i)
for(int j=1;j<=25;++j)
}for(int i=1;i<=m;i++)
return0;
}
優點:1、碼量小
2、快(不用說了,線段樹常數大得呦...)
缺點:1、只能靜態
2、只能最值
(完)
ST表 學習筆記
概念 st表是用來求解區間最大值的一種優秀的離線演算法,它可以 o n logn o nlogn o nlog n 預處理,然後o 1 查詢,如何實現呢?思想運用了近似於區間dp的方法,乙個大區間有小區間轉移得到,不同的是,我們定義st i k st i k st i k 表示從第i ii個位置起,...
演算法筆記 st表
概述 用倍增法求區間最值的離線演算法,o nlogn 預處理,o 1 訪問。預處理 狀態 st i j i,i 2 j 之間的最值 狀態轉移 如果j等於0,st i j a i 如果j大於0,st i j max st i j 1 st i 2 j 1 j 1 或st i j min st i j ...
ST表學習筆記
st表是一種利用dp思想求解最值的倍增演算法 st表常用於解決rmq問題,即求解區間最值問題 接下來以求最大值為例分步講解一下st表的建立過程 1.定義 f i j 表示 i,i 2j 1 這個長度為2j的區間中的最大值 2.預處理 f i 0 a i 即區間 i,i 的最大值就是a i 3.狀態轉...