最大連續區間和是乙個經典的問題。給定乙個長度為n的序列a[1],a[2]...a[n-1],a[n],求乙個連續的子串行a[i],a[i+1]...a[j-1],a[j],使得a[i]+a[i+1]...a[j-1]+a[j]最大。
①最簡單最容易想到的就是根據定義來列舉。
列舉上下界,維護乙個max值即可。
其中列舉上下界的時間複雜度為o(n^2),求區間和的複雜度為o(n),所以總時間複雜度為o(n^3)。
( i = 1 ; i <= n ; i++ )
( j = i ; j <= n ; j++ )
ans = max(ans,accumulate(a+i,a+j+1,0));
②其實就是第一種方法的優化。
這裡有個很容易想到的優化,即預處理出字首和sum[i]=a[0]+a[1]+...+a[i-1]+a[i],算區間和的時候即可將求區間和的複雜度降到o(1),列舉上下界的複雜度不變,所以總時間複雜度為o(n^2)。
( i = 1 ; i <= n ; i++ )
sum[i]=sum[i-1]+a[i];
( i = 1 ; i <= n ; i++ )
( j = i ; j <= n ; j++ )
ans = max(ans,sum[j]-sum[i-1]);
③可以利用動態規劃的思維來繼續優化,得到乙個線性的演算法,也是最大連續區間和的標準演算法
定義maxn[i]為以i為結尾的最大連續和,則很容易找到遞推關係:maxn[i]=max+a[i]。
所以只需要掃瞄一遍即可,總時間複雜度為o(n)。
( i = 1 ; i <= n ; i++ )
④同樣用到類似的思維。
首先也需要預處理出字首和sum[i],可以推出ans=max | 0<=j( i = 1 ; i <= n ; i++ )
sum[i]=sum[i-1]+a[i];
( i = 1 ; i <= n ; i++ )
總結:雖然樸素的o(n^3)和字首和優化的o(n^2)演算法很容易想到,但**實現卻反而比方法三麻煩,第四個方法雖然有和方法三相同的複雜度,但需要乙個預處理和多出的o(n)的空間,所以,方法三很好很強大。
hdu 1540 線段樹 最大連續區間
在區間中,有三種操作,q x 查詢包含x的最長連續區間 d x 將x點毀掉即x點左右不再連續 r 修復上一次毀壞的點 思路 記錄每個區間的左右端的連續區間長度,x若在左端點連續區間,則該區間只可能是其父親的右孩子,因為如果是左孩子,則訪問其父區間的時候,父區間的左連續區間便已包含x。所以直接將該右孩...
HDU 1540 線段樹 區間合併 最大連續區間)
做kuangbin線段樹專題的時候遇到的題目,感覺這是一道非常有趣的題目。線段樹的題目做的比較少,沒有見過這種通過線段樹在區間上做文章的題目,感覺做完這個題目之後加深了對線段樹左右孩子所覆蓋的區間之間的關係的認識。題意 1 n個地道,m個次操作,d代表摧毀第i個地道,q代表查詢包含第i個地道的最大連...
連續區間最大和問題
連續區間最大和問題指的是在給定的一串串行中找出和最大的連續區間。解決這類問題有下面五種方法 1.o n 3 暴力列舉 這種方法就不需要多說了,最簡單的方法,但複雜度很高,資料量大時不可取。2.o n 2 預處理 列舉 這種方法無非是在上一種方法的基礎上做些優化。sum i 表示從1 i 這段區間的和...