分治法求最大子段

 1 #include <iostream>
 2 using namespace std;
 3 int maxInterval(int *a, int left, int right,int & start,int & end); 
 4 int main()
 5 {
 6     //分治法 
 7     int cishu=0;
 8     cin>>cishu;
 9     int a[100000]; 
10     for(int k=0;k<cishu;k++)
11     {
12         int start = 0;//起始位置
13         int end = 0;//结束位置
14         int max = -1000;
15         int n=0;
16         cin>>n;
17         for(int i=0;i<n;i++)
18         {
19             cin>>a[i];    
20         }
21         max=maxInterval(a,0,n-1,start,end); 
22          cout<<"Case "<<k+1<<":"<<endl;
23          cout<<max<<" "<<start+1<<" "<<end+1<<endl;
24          if(k!=cishu-1)
25              cout<<endl;
26     }
27      
28     return 0;
29 }
30 int maxInterval(int *a, int left, int right,int & start,int & end)
31  {
32     if(right==left)
33     {
34         start=left;
35         end=left;
36         return a[left]>0?a[left]:0;
37         
38     }
39     int center = (left+right)/2;
40     int start1=0,end1=0;
41     int start2=0, end2=0;
42     int leftMaxInterval = maxInterval(a,left,center,start1,end1);
43     int rightMaxInterval= maxInterval(a,center+1,right,start2,end2);
44     int sum = 0;
45     int left_max = 0;
46     for(int i = center; i >= left; --i)
47     {
48        sum += a[i];
49        if(sum >= left_max)
50        {
51               start=i;
52             left_max = sum;
53        }
54     }
55     sum = 0;
56     int right_max = 0;
57     for(int i = center+1; i <= right; ++i)
58     {
59        sum += a[i];
60        if(sum > right_max)
61        {
62             right_max = sum; 
63                end=i;
64        }
65     }
66     int res = left_max+right_max;
67     if(res <= leftMaxInterval)
68     {
69         start=start1;
70         end=end1;    
71         res = leftMaxInterval;
72     } 
73     if(res < rightMaxInterval)
74     {
75         start=start2;
76         end=end2;
77         res = rightMaxInterval;
78     }
79     return res;
80  }
View Code

这是杭电ACM1003,不过好像报错了,,不知道什么地方错了

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int cishu=0;
 6     cin>>cishu;
 7     int a[100001],b[100001],c[100001][2];
 8     for(int k=1;k<=cishu;k++)
 9     {
10         int start = 0;//起始位置
11         int end = 0;//结束位置
12         int max = 0;
13         cin>>a[0];
14         b[0]=a[0];
15         for(int i=1;i<=a[0];i++)
16         {
17             cin>>a[i];    
18         }
19         b[1]=a[1];
20         c[1][0]=c[1][1]=1;
21         for(int i=2;i<=b[0];i++)
22         {
23             if(b[i-1]>=0)
24             {
25                 b[i]=b[i-1]+a[i];    
26                 c[i][0]=c[i-1][0];
27                 c[i][1]=i;
28             }    
29             else 
30             { 
31                 b[i]=a[i];    
32                 c[i][0]=c[i][1]=i;
33             } 
34         }
35         max=b[1];
36         int index=1;
37         for(int j=1;j<=a[0];j++)
38         {
39             if(b[j]>max)
40             {
41                 max=b[j];    
42                 index=j;
43             }    
44         }    
45          cout<<"Case "<<k<<":"<<endl;
46          cout<<b[index]<<" "<<c[index][0]<<" "<<c[index][1]<<endl;
47          if(k!=cishu)
48              cout<<endl;
49     }
50     return 0;
51 }
View Code

这个通过了,,不过它用的不是分治,递归

posted @ 2013-11-25 19:44  JustRight  阅读(136)  评论(0)    收藏  举报