20分的分治法,求助
查看原帖
20分的分治法,求助
732979
killerqueue楼主2022/9/21 17:33
#include <iostream>
#include<math.h>
using namespace std;
//这是用于求出最大左右子串的和
int Acrossingsubarray(int a[], int low, int mid, int high)
{
    int Sleft = -19260817;
    int Sright = -19260817;
    int sum = 0;
    int S=0;
    for (int i = mid; i >=low; i--) {
        sum = sum + a[i];
        
        Sleft = max(Sleft, sum);
    } //左子串最大
    sum = 0;
    for (int i = mid + 1; i <= high; i++) {
        sum += a[i];
       
        Sright = max(Sleft, sum);
    }//右字串最大
    S = Sleft + Sright;
    return S;
}

//分治递归求解

int Maxsubarray(int a[], int low, int high)
{
    int mid;
    int S1,S2, S3;
    int Smax;
    if (low == high) {
        return a[low] ;
    }//low=right直接返回这个值
    else {
        mid = (low + high) / 2;
        S3 = Acrossingsubarray(a, low, mid, high);
        S1 = Maxsubarray(a, low, mid);
        S2 = Maxsubarray(a, mid + 1, high);
        
        Smax = max(max(S1, S2), S3);
        return Smax;
    }
}

    int main()
{
        int A[100000];
        int n;
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> A[i];
        }
        int t = Maxsubarray(A, 0, n-1);
        cout << t;
        
        return 0;
    }
2022/9/21 17:33
加载中...