分治法求最大子段
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 }
这是杭电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 }
这个通过了,,不过它用的不是分治,递归

浙公网安备 33010602011771号