• 最大子数组的递归求法模板


    将最大子数组分三种情况讨论,一定在left段,right段,已经过mid两侧

      mid = (low+high)/2

    1. low«i«j«mid
    2. low«i«mid«high
    3. mid+1«i«j
    #include <iostream>
    #include <cstdlib>
    #define inf 0x3f3f3f
    using namespace std;
    
    int findCrossingMaxSubarray(int a[],int low,int mid,int high,int &cros_left,int &cros_right){
        int left_sum=-inf;
        int sum=0;
        //find the cros_left
        for(int i=mid;i>=low;i--){
            sum += a[i];
            if(left_sum<sum){
                left_sum = sum;
                cros_left = i;
            }
        }
        sum = 0;
        int right_sum = -inf;
        //find the cros_right
        for(int i=mid+1;i<=high;i++){
            sum += a[i];
            if(right_sum<sum){
                right_sum = sum;
                cros_right = i;
            }
        }
        return left_sum+right_sum;
    }
    
    int findMaxSubarray(int a[],int low,int high,int &left,int &right){
        if(low==high){
            left = low;
            right = high;
            return a[low];
        }
    
        int mid = (low+high)/2;
        //find the left max subarray
        int left_left,left_right;
        int left_sum;
        left_sum =  findMaxSubarray(a,low,mid,left_left,left_right);
    
        int right_left,right_right;
        int right_sum;
        right_sum = findMaxSubarray(a,mid+1,high,right_left,right_right);
    
        //find the crossing mx subarray
        int crossing_left,crossing_right;
        int crossing_sum;
        crossing_sum = findCrossingMaxSubarray(a,low,mid,high,crossing_left,crossing_right);
    
        //the first or the last
        if(left_sum>=right_sum&&left_sum>crossing_sum){
            left = left_left;
            right = left_right;
            return left_sum;
        }
        else if(right_sum>=left_sum&&right_sum>crossing_sum){
            left = right_left;
            right = right_right;
            return right_sum;
        }
        else{
            left = crossing_left;
            right = crossing_right;
            return crossing_sum;
        }
    }
    
    int main()
    {
        int n;
        cin>>n;
        int *a = (int*)malloc(sizeof(int)*n);
    
        for(int i=0;i<n;i++)
            cin>>a[i];
    
        int left,right,sum;
        sum = findMaxSubarray(a,0,n-1,left,right);
        cout<<"left:"<<left<<" "<<"right:"<<right<<" "<<"sum:"<<" "<<sum;
        free(a);
        //cout << "Hello world!" << endl;
        return 0;
    }
    View Code

     hd1003

    在一个谎言的国度,沉默就是英雄
  • 相关阅读:
    Django rest_framework实现增删改查接口
    文件的三种打开方式知识点回顾
    Django中基表的创建、外键字段属性简介、脏数据概念、子序列化
    drf序列化与反序列化作业1
    rest_framework序列化与反序列化1
    APIview的请求生命周期源码分析
    sql
    正则上面的一个坑
    多线程与多进程---方法对比与使用
    网络编程----踩坑篇
  • 原文地址:https://www.cnblogs.com/EdsonLin/p/5321481.html
Copyright © 2020-2023  润新知