input示例
6output示例-211
-413
-5-2
201.最大子段和模板
#include "2.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;
}
預處理:字首和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...