解释什么是循环区间:
有一个数组序列: a: a1,a2,a3,a4,a5 ------> 循环区间:a1,a2,a3,a4,a5,a1,a2,a3......
数据结构:
mindp数组,maxdp数组,mmin,mmax,totalsum标记符
算法设计:
动态规划
算法解释:
1.首先,我们不考虑区间是否循环,我们就直接求出1~n的maxdp,然后求出mmax;
2.之后,我们加入循环区间的条件,
假设有一段序列(子段和)的最大值不是在1~n之间的,它在ak~ap之间,且当然满足p-k<=n-1
现在,我们重新排列之,
算了,答案就是 ans = max(dmmax,totalsum-dpmmin);..orz
CODE:(51nod1050)
#include <cstdio>
#include <algorithm>
#include <cmath>
typedef long long ll;
using namespace std;
const ll MAXN = 50000+10;
int n;
ll a[MAXN],dp[MAXN],ans,dpmmax,totalsum,dpmin[MAXN],dpmmin;
int main()
{
ans=dpmmax=totalsum=dpmmin=0;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%lld",&a[i]);
totalsum+=a[i];
dp[i]=dpmin[i]=a[i];
}
dpmmax=a[0],dpmmax=a[0];
for(int i=1;i<n;++i)
{
dp[i]=max(dp[i],dp[i-1]+a[i]);
dpmmax=max(dpmmax,dp[i]);
dpmin[i]=min(dpmin[i],dpmin[i-1]+a[i]);
dpmmin=min(dpmmin,dpmin[i]);
}
ans=max(dpmmax,totalsum-dpmmin);
printf("%lld\n",ans);
}
/*
6
-2
11
-4
13
-5
-2
*/