st表,聽起來高大上,實際上限制非常多,僅僅可以求最值問題;
為什麼?先從原理看起;
st表運用了倍增的思想:st[i][j] = min(st[i][j - 1],st[i + 2^(j - 1))][j - 1]);
意義是:從i開始向後連續2^j個位置的最大值是,i開始向後連續2^(j-1)個位置的最大值和i+2^(j-1)開始向後連續2^(j-1)個位置的最大值;
好了,結構建立起來了,那麼怎麼查詢呢?
乙個公式:2^log(a)>a/2。
所以說,查詢(x,y)時我們設k=log(y-x+1);
ans=max(f[x][k],f[y-(1<
現在我們知道了,st表只能求最值的原因是它在查詢時,為了節約時間複雜度而導致查詢區間取並集操作;這樣求區間和便無法得到正確答案;
附:1.求一維st最值:
#include #define int long long
using namespace std;
int a[100010];
int f[100010][40],g[100010][40];
int n,q;
void build()
for(register int j=1;(1《而二維st表原理就是將乙個正方形分成了4份:
令 st[i][j][k]表示左上角為i,j,邊長為k的正方形中的最大值。
st[i][j][k]=max(st[i][j][k-1],st[i+(1<
查詢時與一維st表類似,取並集操作;
#include #define inc(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
int a,b,n;
int mmap[1001][1001];
int f[1001][1001][8],g[1010][1010][8];
void build()
} for(int k=1;k<=7;k++){
for(int i=1;i+(1《在做一維和二維st表的時候,我們可以自己推出:三維的st表,甚至於四維的st表;只不過由於他們的時間複雜度較高,記憶體需求較大,我們便不再需要他們了。但這種思維可以運用到別的地方。
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 ...
ST表(RMQ問題 區間最值查詢
3 2 4 5 6 8 1 2 9 7 預處理,用dp解決。設a i 是要求區間最值的數列,dp i,j 表示從第i個數起連續2 j個數中的最大值。dp 1,0 表示第1個數起,長度為2 0 1的最大值,其實就是3這個數。dp 1,2 5,dp 1,3 8,dp 2,0 2,dp 2,1 4 可以看...
求解區間最值的ST演算法
作用 st演算法是用來求解給定區間rmq的最值,本文以最小值為例 舉例 給出一陣列a 0 5 則區間 2,5 之間的最值為1。1 離線預處理 運用dp思想,用於求解區間最值,並儲存到乙個二維陣列中。具體解釋 1 離線預處理 st演算法使用dp思想求解區間最值,貌似屬於區間動態規劃,不過區間在增加時,...