最大子段和 模板題 51Nod 1049

2022-05-01 23:09:15 字數 2758 閱讀 5107

n個整數組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的連續子段和的最大值。當所給的整數均為負數時和為0。

例如:-2,11,-4,13,-5,-2,和最大的子段為:11,-4,13。和為20。

input

第1行:整數序列的長度n(2 <= n <= 50000)

第2 - n + 1行:n個整數(-10^9 <= a[i] <= 10^9)

output

輸出最大子段和。
input示例

6

-211

-413

-5-2

output示例

20

給一組資料:

方法一:分冶法,遞迴求解,每次將所求區間折半,乙個從中間往左便利,乙個從中間向右便利(保證和值存在於連續的區間)

,即乙個左值,乙個右值,兩者相加求和值,三者比較求最大,不斷遞迴,求最大區間和

suml(1,n)=sum(1,n/2),sumr(1,n)=sum(n/2+1,n);sum=suml+sumr;sum=max(sum,max(suml,sumr));

[1]、a[1:n]的最大子段和與a[1:n/2]的最大子段和相同; 

[2]、a[1:n]的最大子段和與a[n/2+1:n]的最大子段和相同;

[3]、a[1:n]的最大欄位和為

,且1<=i<=n/2,n/2+1<=j<=n。

可用遞迴方法求得情形[1],[2]。對於情形[3],可以看出a[n/2]與a[n/2+1]在最優子串行中。因此可以在a[1:n/2]中計算出

,並在a[n/2+1:n]中計算出

。則s1+s2即為出現情形[3]時的最優值。

**如下:

#include #include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lowbit(x) (x&(-x))

#define max(x,y) (x>y?x:y)

#define min(x,y) (x#define max 100000000000000000

#define mod 1000000007

#define pi 3.141592653589793238462

#define inf 0x3f3f3f3f3f

#define mem(a) (memset(a,0,sizeof(a)))typedef

long

long

ll;ll a[

50006

],n;

ll tdq(ll *a,ll left,ll right)

ll mid=(left+right)>>1

; ll leftsum=tdq(a,left,mid);

ll rightsum=tdq(a,mid+1

,right);

ll suml=a[mid],sumr=a[mid+1],sl=0,sr=0

; ll sum;

for(ll i=mid;i>=left;i--)

for(ll i=mid+1;i<=right;i++)

sum=suml+sumr;

sum=max(sum,max(leftsum,rightsum));

return

sum;

}int

main()

方法二:動態規劃

區間和b大於0時就往下加,否則歸零。

//

最大字段求和動態規劃

#include #include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lowbit(x) (x&(-x))

#define max(x,y) (x>y?x:y)

#define min(x,y) (x#define max 100000000000000000

#define mod 1000000007

#define pi 3.141592653589793238462

#define inf 0x3f3f3f3f3f

#define mem(a) (memset(a,0,sizeof(a)))typedef

long

long

ll;ll dp[

50006],a[50006

],n;

intmain()

ll sum=0,sumson=0

;

for(int i=1;i<=n;i++)

printf(

"%i64d\n

",sum);

return0;

}

51Nod 1049最大子段和 模板

input示例 6 211 413 5 2 output示例 201.最大子段和模板 include bits stdc h using namespace std define rep i,s,n for int i s i define ll long long define inf 0x3f3...

51nod 最大子段和

給出乙個整數陣列a 正負數都有 如何找出乙個連續子陣列 可以乙個都不取,那麼結果為0 使得其中的和最大?例如 2,11,4,13,5,2,和最大的子段為 11,4,13。和為20。輸入 第1行 整數序列的長度n 2 n 50000 第2 n 1行 n個整數 10 9 a i 10 9 輸出 輸出最大...

51nod 最大子段和

題面 以乙個長為n的數列,求連續子段的最大值。思路1直接列舉o n 3 tle穩穩的 include using namespace std int n,a 50050 ans int main ans max ans,t 更新最值 cout n return 0 字首和優化的列舉法,o n 2 還...