2049--Maximum sum

来源:互联网 发布:python多进程共享变量 编辑:程序博客网 时间:2024/05/18 02:12

题目大意是:对于给定的整数序列A={a1, a2,..., an},我们如下定义函数 d(A):


我们的目标就是求出d(A)。


写完后搜了一下网上的结果,思路如下:先从左到右扫描一遍得到以ai为结尾的最大连续子段和,然后从右到左扫描一遍得到以ai为开头的最大连续子段和,最后整体扫描一遍就可以了。


另一种思路如下:记b[i]为a[n]中前i个数的最大连续子段和,c[i]为以a[i]结尾的两段最大连续子段和,则有递推公式:c[i]=max(c[i-1],b[i-1])+a[i].

#include <stdio.h>int T,n;int a[50010];long long b[50010],c[50010];long long MAX(long long x,long long y){return x>y?x:y;}int main(){scanf("%d\n",&T);while(T--){long long ans=-20002;scanf("\n%d\n",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);b[0]=a[0];b[1]=MAX(b[0],0)+a[1];c[0]=-20002;c[1]=a[0]+a[1];ans=MAX(c[1],ans);for(int i=1;i<n;i++){b[i]=MAX(b[i-1],0)+a[i];}b[1]=MAX(b[1],b[0]);for(int i=2;i<n;i++){b[i]=MAX(b[i],b[i-1]);c[i]=MAX(c[i-1],b[i-1])+a[i];ans=MAX(ans,c[i]);}printf("%ld\n",ans);}return 0;}


原创粉丝点击