标签:style blog http io ar color os sp for
题目链接:http://poj.org/problem?id=2479
题意:求所给数列中元素值和最大的两段子数列之和。
分析:从左往右扫一遍,b[i]表示前i个数的最大子数列之和。
从右往左扫一遍,c[i]表示后i个数的最大子数列之和。
ans=max(ans,b[i]+c[i+1])0<i<n
dp方程为 sum=max(sum+a[i],a[i])
dp[i]=max(dp[i-1],sum)
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <vector> #include <set> #include <map> #define LL long long #define mod 1000000007 #define inf 0x3f3f3f3f #define N 50010 using namespace std; int a[N],b[N],c[N]; int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); int sum=a[1]; b[1]=a[1]; for(int i=2;i<=n;i++) { sum=max(sum+a[i],a[i]); b[i]=max(sum,b[i-1]); } sum=a[n];c[n]=a[n]; for(int i=n-1;i>=1;i--) { sum=max(sum+a[i],a[i]); c[i]=max(sum,c[i+1]); } int ans=-inf; for(int i=1;i<n;i++) { ans=max(b[i]+c[i+1],ans); } printf("%d\n",ans); } }
标签:style blog http io ar color os sp for
原文地址:http://www.cnblogs.com/lienus/p/4160718.html