分治

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int maxsum(int* A, int x, int y)//可以求[x,y)上的最大连续和
{
    if (y - x == 1)return A[x];
    int m = x + (y - x) / 2;
    int maxs = max(maxsum(A, x, m), maxsum(A, m, y));
    int L = A[m - 1],v = 0;
    for (int i = m - 1; i >= x; i--) L = max(L, v += A[i]);//合并左边的最大连续和
    int R = A[m];
    v = 0;
    for (int i = m; i < y; i++) R = max(R, v += A[i]);//合并右边的最大连续和
    return max(L + R, maxs);
}

int main(void)
{
    //求最大连续和
    int A[] = { 3,4,10,-1,10,5 };
    int a = maxsum(A, 0, 5);
    cout << a << endl;
    return 0;
}

 

posted @ 2021-02-09 11:40  loliconsk  阅读(62)  评论(0)    收藏  举报