【题目描述】
N个数围成一圈,要求从中选择若干个连续的数(注意每个数最多只能选一次)加起来,问能形成的最大的和。
【输入描述】
第一行输入N,表示数字的个数,第二行输入这N个数字。
【输出描述】
输出最大和。
【样例输入】
8
2 -4 6 -1 -4 8 -1 3
【样例输出】
14
【数据范围及提示】
1 <= N <= 100000,答案在Longint范围内。
源代码: #include<cstdio> #include<cstring> #include<algorithm> #define INF 100000000 using namespace std; int n,sum(0),i[100001],f[100001],ans=-INF,num=INF; int main() //当数据皆为负数时,什么都不会选,就是0,我觉得这样应该也对。 { scanf("%d",&n); for (int a=1;a<=n;a++) { scanf("%d",&i[a]); sum+=i[a]; //总和。 } for (int a=1;a<=n;a++) //1~n链状时的最大值。 { if (f[a-1]>0) f[a]=f[a-1]+i[a]; else f[a]=i[a]; ans=max(ans,f[a]); } memset(f,0,sizeof(f)); //别忘记初始化。 for(int a=1;a<=n;a++) //环状(区间在两端)时的最大值。 { if (f[a-1]<0) f[a]=f[a-1]+i[a]; else f[a]=i[a]; num=min(num,f[a]); } ans=max(ans,sum-num); //取其优。 printf("%d",ans); return 0; }