最大连续子序列

来源:互联网 发布:淘宝客返利网 赚钱 编辑:程序博客网 时间:2024/05/18 03:10

http://acm.hdu.edu.cn/showproblem.php?pid=1231


当不需求首尾元素时,可以用分治法:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[10005];int maxsum(int x,int y){if(y-x==1)  return a[x];int m=x+(y-x)/2;int maxs=max(maxsum(x,m),maxsum(m,y));int v,l,r;v=0; l=a[m-1];for(int i=m-1;i>=x;i--)l=max(l,v+=a[i]);v=0; r=a[m];for(int i=m;i<y;i++)r=max(r,v+=a[i]);return max(maxs,l+r);}int main(int argc, char *argv[]){int n;while(scanf("%d",&n)==1&&n){for(int i=0;i<n;i++)scanf("%d",&a[i]);int ans=maxsum(0,n);printf("%d\n",ans);}return 0;}


需要首尾元素时:


#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int INF=-200000000;int main(int argc, char *argv[]){int n;while(scanf("%d",&n)!=EOF&&n){int sum=0,best=INF;int s,e,anss,anse;int a,a1,an;for(int i=1;i<=n;i++){scanf("%d",&a);if(i==1) a1=a;if(i==n) an=a;if(sum+a>a){sum+=a;e=a;}else{s=e=sum=a;}if(best<sum){best=sum;anss=s;anse=e;}}if(best<0)printf("%d %d %d\n",0,a1,an);else printf("%d %d %d\n",best,anss,anse);}return 0;}



0 0
原创粉丝点击