ST表學習筆記

2022-04-28 20:54:17 字數 1196 閱讀 9795

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(int

n)

好啦建立好了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個數字。根據動態規劃的定義,把這個區間分割成...