算法设计与分析第二章作业

m0_74356224 2022级 2023-11-05 17:36:45

三种情况:

         情况1:最大字段和全部取自左边

         情况2:最大字段和全部取自右边 

         情况3:最大字段和两边都取 

(1)伪代码:

int maxSum(int a[],int left,int right) {

    int sum = 0;

    if(left == right)

    {

        if(a[left] > 0) sum = a[left];

        else sum = 0;

    }

    else 

    {

        int center = (left + right) / 2;

        int leftsum = maxSum(a, left, center);

        int rightsum = maxSum(a, center + 1, right);

 

        int s1 ,lefts = 0;

        for(int i = center ; i >= left; i--) {

            lefts += a[i];

            if(lefts > s1) s1 = lefts;

        }

        int s2 ,rights = 0;

        for(int i = center + 1 ; i <= right; i++) {

            rights += a[i];

            if(rights > s2) s2 = rights;

        }

        sum = s1 + s2;

        if(sum < leftsum) sum = leftsum;

        if(sum < rightsum) sum = rightsum;    

    }

    return sum;

}

(2)时间复杂度

T(n)=O(1)+2T(n/2)+O(n)=O(nlogn)

感悟

分治法就是分而治之,将一个规模为n的问题分解为k个规模比较小的字问题,这些子问题相互独立且与原问题相同。然后递归的解决子问题,再将子问题合并成员问题。

在处理这类问题时分治法一共分为三个步骤:划分、求解、合并,利用递归求解子问题。

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

434

社区成员

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

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