【题目描述】
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];elsef[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];elsef[a]=i[a];num=min(num,f[a]);}ans=max(ans,sum-num); //取其优。printf("%d",ans);return 0; }