最大子段和
N个整数组成的序列a11,a22,a33,…,ann, 求该序列如aii+ai+1i+1+…+ajj的连续子段和的最大值。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
Input第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N + 1行:N个整数(-10^9 <= Aii <= 10^9)Output输出最大子段和。Sample Input
6 -2 11 -4 13 -5 -2
Sample Output
20
每一步都是最佳结果,采用dp
#include<iostream> #include<cstring> using namespace std; typedef long long ll; int main() { int n; ll a[50005]; ll dp[50005]; ll ans=0; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } dp[1]=a[1]; for(int i=2;i<=n;i++) { if(dp[i-1]>0) dp[i]=dp[i-1]+a[i]; else dp[i]=a[i]; if(dp[i]>ans) ans=dp[i]; } if(ans>0) cout<<ans<<endl; else cout<<'0'<<endl; return 0; }
浙公网安备 33010602011771号