HDU 2131: 最大连续子序列

#include<bits/stdc++.h>
using namespace std;
const int N = 10000, INF = 1000000000;
int k, A[N];
struct MaximumSubarray {
int low, high, sum;
};
MaximumSubarray FindMaximumCrossingSubarray(int low, int mid, int high) {
int left_sum, sum, max_left, right_sum, max_right;
left_sum = -INF;
sum = 0;
for (int i = mid; i >= low; i--) {
sum += A[i];
if (sum > left_sum) {
left_sum = sum;
max_left=i;
}
}
right_sum = - INF;
sum=0;
for(int j=mid+1;j<=high;j++){
sum+=A[j];
if(sum>right_sum){
right_sum=sum;
max_right=j;
}
}
return {max_left,max_right,left_sum+right_sum};
}
MaximumSubarray FindMaximumSubarray(int low, int high) {
if (high == low)
return {low, high, A[low]};
else {
int mid = (low + high) / 2;
MaximumSubarray left = FindMaximumSubarray(low, mid),
right = FindMaximumSubarray(mid + 1, high),
cross = FindMaximumCrossingSubarray(low, mid, high);
if (left.sum >= right.sum && left.sum >= cross.sum)
return left;
else if (right.sum >= left.sum && right.sum >= cross.sum)
return right;
else return cross;
}
}
int main() {
ios::sync_with_stdio(false);
while (cin >> k&&k) {
for (int i = 0; i < k; i++) {
cin >> A[i];
}
MaximumSubarray maximumSubarray=FindMaximumSubarray(0,k-1);
if(maximumSubarray.sum<0)
cout<<0<<' '<<A[0]<<' '<<A[k-1]<<endl;
else
cout<<maximumSubarray.sum<<' '<<A[maximumSubarray.low]<<' '<<A[maximumSubarray.high]<<endl;
}

}

猜你喜欢

转载自www.cnblogs.com/zjnu/p/9300280.html