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.狀態轉移
將[i,i+2j-1]平均分成兩份,分別為[i,i+2j-1-1]和[i+2j-1,i+2j-1],兩段的長度均為2j
[i,i+2j-1]的最大值為這兩段的最大值中的較大值,即f[i][j]=max(f[i][j-1],f[i+2j-1][j-1])
4.核心**
void st(intn)
好啦建立好了st表,接下來我們就可以直接o(1)地查詢啦!qwq
講一講查詢的步驟:
1.查詢過程
若需要查詢的區間為[i,j],那麼我們需要找到兩個覆蓋這個閉區間的最小冪區間,這兩個區間可以重疊,因為這對區間最大值並沒有什麼影響。
這個區間的長度為j-i+1,所以我們要記錄乙個值k=log2(j-i+1)
於是就可以得到答案max(i,j)=max(f[i][k],f[j-(1<
2.完整**
1 #include2#define go(i,a,b) for(register int i=a;i<=b;i++)
3using
namespace
std;
4const
int maxn=1e6+5;5
int a[maxn],f[maxn][20];6
void st(int
n)13
intmain()
24return0;
25 }
update!加一道例題——
鄰值查詢
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表,一種高效的區間最值查詢 rmq 演算法。本質其實是乙個動態規劃。其實吧,對於看過線性dp的人來說應該不難理解,只是處理有些麻煩。但是本土狗因為 1的問題居然改了許久.用兩個2 i的區間把整個區段覆蓋,dp i j 表示區間最值,從i開始,向前2 j個數字。根據動態規劃的定義,把這個區間分割成...