環上最大連續和

2021-09-18 01:44:38 字數 2119 閱讀 7996

給定n,k以及乙個環:a[1],a[2],a[3],…a[n],其中a[1]的左邊是a[n]。

求該環上最大的連續子段和,要求選出的子段長度不超過k。

輸入描述:

第一行兩個整數n和k。

接下來一行,n個整數表示a[i]。

輸出描述:

輸出題目要求的最大連續和。

普通的最大連續和用簡單的dp就可以解決了。本題還要求這個最大連續和的序列長度不超過k。我們首先維護乙個陣列a的字首和sum, 這樣一來求區間[l,

r]

[l,r]

[l,r

]的和就為:sum

[r]−

sum[

l−1]

sum[r]-sum[l-1]

sum[r]

−sum

[l−1

], 最大連續和問題可以轉化為對於每個i,找到最小的j,滿足j−i

<=k

j-i<=k

j−i<=k

即可,即可轉化為單調佇列問題,用優先佇列維護字首和的最小值即可.

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f

#define mem0(a) memset(a,0,sizeof(a))

#define mem1(a,b) memset(a,b,sizeof(b)

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

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

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

using namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int maxn=

2e5+5;

const

int maxm=

1e5+5;

const

int mod=

1e9+7;

const

int inf=

1e9;

const

double eps=

1e-9

;const

double pi=

acos(-

1.0)

;int a[maxn]

;struct node

; bool operator<

(const node& tmp)

const

}sum[maxn]

;priority_queue qq;

inline

intmin

(int x,

int y)

inline

intmax

(int x,

int y)

intmain()

for(

int i=n+

1;i<=n+k;i++

)int ans=

-inf;

qq.push

(sum[0]

);for(

int i=

1;i<=n+k;i++

) ans=

max(ans,sum[i]

.x-qq.

top(

).x);}

printf

("%d\n"

,ans)

;return0;

}

最大連續和

這個問題對我來說還挺難的,當初做dp時水過去了,但沒徹底理解,這次打算好好分析一下,爭取徹底搞懂。首先,像 1 1 2 2 3 3 4 4 5 5這樣的數列,想要找連續最大和,可以有很多種方法,從最慢的列舉o n 3 到最快的動態規劃o n 毫無疑問,我們要選擇複雜度低的演算法。所以我這裡就只分析兩...

最大連續和

求陣列中數的最大連續和,如 1,1,1,1,1 最大連續和為3 一 動態規劃 當我們從頭到尾遍歷這個陣列的時候,對於陣列裡的乙個整數,它有幾種選擇呢?它只有兩種選擇 1 加入之前的subarray 2.自己另起乙個subarray。那什麼時候會出現這兩種情況呢?設狀態為f j 表示以s j 結尾的最...

最大連續和

給出乙個長度為n的序列a1,a2,an,求最大連續和 使用列舉 時間複雜度o n 3 best a 1 初始最大值 for int i 1 i n i 設si a1 a2 ai,則ai ai 1 aj sj si 1 連續子串行的和等於兩個字首之差 時間複雜度o n 2 s 0 0 for int ...