分治法 最大字段和作业

呜呼喵哉 2022级 2023-11-04 01:04:25
  1. 请以伪代码描述最大字段和的分治算法

    #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;
    }

  2. 分析该算法的时间复杂度O(nlogn)

  3. 结合本章的学习,你对分治法的体会和思考分治法的基本思想。分治法主要就是缩小问题的规模,来得到问题的答案。对于一个规模为n的问题,若该问题可以容易的解决(比如规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解

...全文
29 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

发帖
与我相关
我的任务
社区描述
广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧