HDU1003

来源:互联网 发布:淘宝手机版店招尺寸 编辑:程序博客网 时间:2024/05/21 12:36

这个题目WR了N多次。。一开始看见100000的输入想采用O(n2)的算法。。直接TLE了。。

今后估计这样太的数据应该采取O(n)或O(nlogn)的算法的。

原题:http://acm.hdu.edu.cn/showproblem.php?pid=1003

因为数据结构书上第一个算法分析实例就是这个题,也没怎么仔细看就直接写了,结果老WR,结果才发现书上的只针对Maxsum为正数的时候才适用,负数的时候书上为0,主要题目貌似也没怎么交代清楚,一个不加算不算子序列。不过AC以后才知道不算。

一开始采用O(nlogn)的分治算法觉得Maxsum很好求,但就是位置不好标记,因为最后涉及到合并,位置好像要讨论多次。就直接采用O(n)的算法。google一下,原来这就是一个很简单的DP思想。状态转移方程为f[i]=max(f[i-1]+a[i],a[i])。

代码:

[cpp] view plaincopy
  1. #include<stdio.h>  
  2. int a[100010];  
  3. int main(){  
  4.     int case_number,k=0,i,number,position1,end,thissum,maxsum,begin;  
  5.     scanf("%d",&case_number);  
  6.     while(case_number--){  
  7.         k++;  
  8.         scanf("%d",&number);  
  9.         for(i=0;i<number;i++)  
  10.             scanf("%d",&a[i]);  
  11.         position1=begin=end=0;  
  12.         maxsum=thissum=a[0];  
  13.         for(i=1;i<number;i++){  
  14.             if(thissum+a[i]<a[i]){             //如果当前值比a[i]小的话则改为a[i]  
  15.                 thissum=a[i];  
  16.                 position1=i;                  //记录下改的位置  
  17.             }  
  18.             else{  
  19.                 thissum=thissum+a[i];            
  20.             }  
  21.             if(thissum>maxsum){                //当前值比最大值大,则头尾都要改  
  22.                 maxsum=thissum;  
  23.                 begin=position1;  
  24.                 end=i;  
  25.             }  
  26.         }  
  27.         printf("Case %d:\n%d %d %d\n",k,maxsum,begin+1,end+1);  
  28.         if(case_number)                        //测试数据之后有空行,一开始也没看见,也WR了。  
  29.             printf("\n");  
  30.     }  
  31.     return 0;  
  32. }  

在付上一个O(nlogn)的算法    分治法

[cpp] view plaincopy
  1. //O(nlogn)   分治排序算法  
  2. int maxsum_version_1(int *a,int x,int y){  //求区间[x,y)的最大值     [2,3)为a2;  
  3.     int L,R,v,m,i,max;  
  4.     if(y-x==1)  
  5.         return a[x];  
  6.     m=x+(y-x)/2;                 //不取m=(y-x)/2 是为了使分界点靠近区间左端点  
  7.     max=(maxsum_version_1(a,x,m)>maxsum_version_1(a,m,y))?maxsum_version_1(a,x,m):maxsum_version_1(a,m,y);  
  8.     v=0;  
  9.     L=a[m-1];  
  10.     for(i=m-1;i>=x;i--){  
  11.         v=v+a[i];  
  12.         L=L>v?L:v;  
  13.     }  
  14.     R=a[m];  
  15.     v=0;  
  16.     for(i=m;i<y;i++){  
  17.         v+=a[i];  
  18.         R=R>v?R:v;  
  19.     }  
  20.     return (max>L+R)?max:L+R;  
  21. }  
0 0
原创粉丝点击