434
社区成员
发帖
与我相关
我的任务
分享请以伪代码描述最大字段和的分治算法
#include<iostream>
using namespace std;
const int MAX=10001;
int n;
int a[MAX];
int maxsubsum(int a[], int low, int high){
int sum=0;
if(low == high){
sum = a[low]>0 ? a[high] : 0;
}
else{
int mid=(low+high)/2;
int leftsum=maxsubsum(a, low, mid);
int rightsum = maxsubsum(a, mid+1, high);
int s1=0;
int lows=0;
for(int i=mid; i>=low; i--){
lows += a[i];
if(lows>s1) s1=lows;
}
int s2=0;
int highs=0;
for(int i=mid+1; i<high; i++){
highs+= a[i];
if(highs>s2) s2=highs;
}
sum = s1 + s2;
if(sum < leftsum) sum = leftsum;
if(sum < rightsum) sum = rightsum;
}
return sum;
}
int maxsum(int a[], int n){
return maxsubsum(a, 0, n - 1);
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<maxsum(a, n)<<endl;
return 0;
}
分析该算法的时间复杂度O(nlogn)
结合本章的学习,你对分治法的体会和思考分治法的基本思想。分治法主要就是缩小问题的规模,来得到问题的答案。对于一个规模为n的问题,若该问题可以容易的解决(比如规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解