51Nod 1049最大子段和 模板

2022-07-05 13:18:14 字數 1477 閱讀 5245

input示例

6

-211

-413

-5-2

output示例

20
1.最大子段和模板

#include "

bits/stdc++.h

"using

namespace

std;

#define rep(i, s, n) for(int i=s;i#define ll long long

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define e 2.71828

#define mod 1000000007

#define n 50010ll a[n];

ll b[n];

intmain()

memset(b,

0,n+1

); max1=-inf;

rep(i,

0,n)

else

if(b[i]>max1)

max1 =b[i];

}if(max1<0

) max1=0

; cout

}return0;

}

2.

預處理:字首和

last:上乙個正數的位置

dp[i]表示這個子段最後乙個是i的最大和

狀態轉移:

如果前乙個是非負數,dp[i]=dp[i-1]+a[i]

否則,dp[i]=max(a[i],dp[last]+sum[i]-dp[last])

原理跟最大欄位和一樣

#include "

bits/stdc++.h

"using

namespace

std;

#define rep(i, s, n) for(int i=s;i#define ll long long

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define e 2.71828

#define mod 1000000007

#define n 50010

intn;

long

long

a[n],dp[n],sum[n];

intmain()

ll ans=0

; rep(i,

1,n+1

) ans=max(ans,dp[i]);

printf(

"%lld

",ans);

}return0;

}

51Nod 1049 最大子段和

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個整數 ...

51nod 1049 最大子段和

1049 最大子段和 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 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,1...

51Nod 1049 最大子段和

1049 最大子段和 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 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,1...