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)output第2 - n + 1行:n個整數(-10^9 <= a[i] <= 10^9)
輸出最大子段和。input示例
6output示例-211
-413
-5-2
20可用遞迴方法求得情形[1],[2]。對於情形[3],可以看出a[n/2]與a[n/2+1]在最優子串行中。因此可以在a[1:n/2]中計算出給一組資料:
方法一:分冶法,遞迴求解,每次將所求區間折半,乙個從中間往左便利,乙個從中間向右便利(保證和值存在於連續的區間)
,即乙個左值,乙個右值,兩者相加求和值,三者比較求最大,不斷遞迴,求最大區間和
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。
,並在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 還...