算法-分治策略

来源:互联网 发布:电信网络诈骗手段 编辑:程序博客网 时间:2024/06/07 03:55

分治法

  • 最大子数组问题
  • 矩阵乘法Strassen算法

最大子数组

  • 运用分治策略:时间复杂度O(NlogN)
  • 运用DP策略:线性时间O(N)
int FindMaxCrossSubarray(vector<int> &arr, int low, int mid, int high){    int left_sum=INT_MIN;    int right_sum=INT_MIN;    int sum=0;    for(int i=mid;i>=low;i--){        sum+=arr[i];        if(sum>left_sum) left_sum=sum;    }    sum=0;    for(int i=mid+1;i<=high;i++){        sum+=arr[i];        if(sum>right_sum) right_sum=sum;    }    return left_sum+right_sum;}int FindMaxSubarray(vector<int> &arr, int low, int high){    int left_sum=0;    int right_sum=0;    int cross_sum=0;    if(high==low) return arr[low];    else{        int mid=(high+low)/2;        left_sum=FindMaxSubarray(arr, low, mid);        right_sum=FindMaxSubarray(arr, mid+1, high);        cross_sum=FindMaxCrossSubarray(arr, low, mid, high);        if(left_sum>=cross_sum && left_sum>=right_sum) return left_sum;        else if(right_sum>=cross_sum && right_sum>=left_sum) return right_sum;        else return cross_sum;    }}
int FindMaxSubarray(vector<int> &arr){    int sum=0;    int ans=INT_MIN;    for(int i=0;i<arr.size();i++){        sum+=arr[i];        ans=max(sum,ans);        sum=max(sum,0);    }    return ans;}
0 0
原创粉丝点击