题意:sum(l,r)表示数列a中索引为l到r-1(都包含)的数之和(如果l==r则为0)。给出数列a,求合适的delim0, delim1, delim2,使res = sum(0, delim0) - sum(delim0, delim1) + sum(delim1, delim2) - sum(delim2, n)最大。
方法:枚举delim1,扫一遍就可以求出此时能使res最大的delim0和delim2。记录res最大值。实现有一些细节,比如可以将res的计算公式化为前缀和的公式。
曾经错在:1.int会爆,没注意 2.输出了调试的时候输出的内容(ans)而不是dl0,dl1,dl2

1 #include<cstdio> 2 typedef long long LL; 3 LL n,a[6000],dl1,dl0,dl2,t_max_dl0,t_max_dl2,max_dl0,max_dl2,t_ans,ans,max1,max_dl1; 4 int main() 5 { 6 LL i,t1; 7 scanf("%lld",&n); 8 for(i=0;i<n;i++) 9 scanf("%lld",&a[i]); 10 for(dl1=0;dl1<n;dl1++) 11 { 12 t_ans=0; 13 t1=0; 14 for(i=0;i<dl1;i++) 15 t1-=a[i]; 16 //此时表示dl0=0时sum(0,delim0)-sum(delim0,delim1) 17 max1=t1; 18 t_max_dl0=0; 19 for(dl0=1;dl0<=dl1;dl0++) 20 { 21 t1+=2*a[dl0-1]; 22 if(t1>max1) 23 { 24 max1=t1; 25 t_max_dl0=dl0; 26 } 27 } 28 t_ans+=max1; 29 t1=0; 30 for(i=dl1;i<n;i++) 31 t1-=a[i]; 32 //此时表示dl2=dl1时sum(delim1,delim2)-sum(delim2,n) 33 max1=t1; 34 t_max_dl2=dl1; 35 for(dl2=dl1+1;dl2<=n;dl2++) 36 { 37 t1+=2*a[dl2-1]; 38 if(t1>max1) 39 { 40 max1=t1; 41 t_max_dl2=dl2; 42 } 43 } 44 t_ans+=max1; 45 if(t_ans>ans) 46 { 47 max_dl0=t_max_dl0; 48 max_dl1=dl1; 49 max_dl2=t_max_dl2; 50 ans=t_ans; 51 } 52 } 53 printf("%lld %lld %lld",max_dl0,max_dl1,max_dl2); 54 //printf("%lld",ans); 55 return 0; 56 }
暴力对拍程序:

1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 typedef long long LL; 5 LL c[5010]; 6 LL n,m; 7 LL res,max_res,a1,a2,a3; 8 LL lowbit(LL x) 9 { 10 return x&-x; 11 } 12 void add(LL num,LL x) 13 { 14 while(num<=n) 15 { 16 c[num]+=x; 17 num+=lowbit(num); 18 } 19 } 20 LL sum1(LL x) 21 { 22 LL ans=0; 23 while(x>0) 24 { 25 ans+=c[x]; 26 x-=lowbit(x); 27 } 28 return ans; 29 } 30 LL sum(LL l,LL r) 31 { 32 if(l>r) return 0; 33 return sum1(r)-sum1(l-1); 34 } 35 int main() 36 { 37 LL i,j,k,t; 38 scanf("%lld",&n); 39 for(i=1;i<=n;i++) 40 { 41 scanf("%lld",&t); 42 add(i,t); 43 } 44 for(i=0;i<=n;i++) 45 for(j=i;j<=n;j++) 46 for(k=j;k<=n;k++) 47 { 48 res=sum(1,i)-sum(i+1,j)+sum(j+1,k)-sum(k+1,n); 49 if(res>max_res) 50 { 51 max_res=res; 52 a1=i;a2=j;a3=k; 53 } 54 } 55 printf("%lld",max_res); 56 return 0; 57 }