動態區間最大子串

2021-09-26 00:05:06 字數 2459 閱讀 1291

原題:

題意:

每次查詢,求給定區間的最大子串。

解析:

維護區間和sum

sumsu

m,區間最大串max

maxma

x,從區間左端點開始往右的最大串lma

xlmax

lmax

,從區間右端點開始往左的最大串rma

xrmax

rmax

。考慮更新max

_r

tmax\_rt

max_rt

,兩個兒子都有一段的情況為:rma

x_ls

+lma

x_rs

rmax\_ls+lmax\_rs

rmax_l

s+lm

ax_r

s,否則就是max

_l

smax\_ls

max_ls

和m ax

_r

smax\_rs

max_rs

其中的乙個

考慮更新lma

x_rt

lmax\_rt

lmax_r

t,顯然從左往右延伸,沒有超過中點時為lma

x_ls

lmax\_ls

lmax_l

s,超過中點時為sum

_ls+

lmax

_r

ssum\_ls+lmax\_rs

sum_ls

+lma

x_rs

r ma

xrmax

rmax

同l ma

x_rt

lmax\_rt

lmax_r

t**:

#include

using

namespace std;

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define per(i,a,b) for(int i=a;i>=b;i--)

#define ll long long

#define ls (rt<<1)

#define rs (rt<<1|1)

#define mid (l+r>>1)

const

int maxn=

2e5+9;

int n;

ll array[maxn]

;struct node tr[maxn<<2]

;void

pushup

(node &ans,node lef,node rig)

void

build

(int rt=1,

int l=1,

int r=n)

build

(ls,l,mid)

;build

(rs,mid+

1,r)

;pushup

(tr[rt]

,tr[ls]

,tr[rs]);

}void

update

(int pos,ll val,

int rt=1,

int l=1,

int r=n)

if(pos<=mid)

update

(pos,val,ls,l,mid)

;else

update

(pos,val,rs,mid+

1,r)

;pushup

(tr[rt]

,tr[ls]

,tr[rs]);

}node query

(int l,

int r,

int rt=1,

int l=1,

int r=n)

if(r<=mid)

return

query

(l,r,ls,l,mid);if

(l>mid)

return

query

(l,r,rs,mid+

1,r)

; node ans,lef=

query

(l,r,ls,l,mid)

,rig=

query

(l,r,rs,mid+

1,r)

;pushup

(ans,lef,rig)

;return ans;

}int

main()

build()

;int _;

for(

scanf

("%d"

,&_)

; _--;)

}

動態規劃 最大子串 HDOJ1003

題目大意 輸入是具有n個整數的向量x,輸出是輸入向量的任何聯絡子向量中的最大和,並輸出該子向量的開始和結束為止。例如 輸入 5 6 1 5 4 7 7 0 6 1 1 6 7 5 輸出 case 1 14 1 4 case 2 7 1 6 分別有四種方法都能夠求解出來分別是o n 3 和o n 2 ...

最大子串乘積

最大子串乘積 輸入n個數,求它的最大的連續子串乘積。例 輸入 1 2 3 7 0 2 3 輸出 實現 include int max subsegment int arr int len 最大子段乘積函式 else if arr j 0 else return max int main main p...

最大子串演算法

最大子串問題是一類經典問題,即在一串整形陣列中選取和最大的子串 給出問題描述 對於乙個包含負值的數字串array 1.n 要找到他的乙個子串array i.j 0 i j n 使得在array的所有子串中,array i.j 的和最大。針對本問題,可有三種方法,一種是暴利破解列舉演算法,所有子串種類...