顺序表应用7:最大子段和之分治递归法

简介: 顺序表应用7:最大子段和之分治递归法

题目简介

题目思路

  • 先考虑当前的元素是不是最后一个,如果是最后一个的话,判断该元素是不是大于0,如果大于,直接返回该函数,小于则返回0。
  • 计算中间元素左边(leftmax)的最大值和右边(rightmax)的最大值,直接用getmax()函数来进行获取
  • 找出左边suml和右边sumr的最大值,进行相加,得出一整部分元素和的最大值Max
  • 最后,将Max和leftmax、rightmax做对比,求出最大的值,return Max.
  • 不要忘了每一次进行函数的时候,cnt都要加一
#include <iostream>
#include <string>
#include <bits/stdc++.h>
using namespace std;
int cnt = 0;
int getmax(int s[], int l, int r)
{
    cnt++;
    if(l == r)//表示当前只剩下一个数字了,如果该数字小于0,则输出0,否则输出他的本身
    {
        if(s[l] < 0)
        {
            return 0;
        }
        else
        {
            return s[l];
        }
    }
    int leftmax, rightmax, Max;
    int mid;
    mid = (l + r) / 2;//找到中间的数字
    leftmax = getmax(s,l,mid);//获取到左边最大的数字
    rightmax = getmax(s,mid+1,r);//获取到右边最大的数字
    int suml = 0;
    int sum = 0;
    int sumr = 0;
    for(int i = mid; i >= l; i--)//找出左边最大的数字,赋值于suml
    {
        sum = sum + s[i];//代表左边数字的累加
        if(sum > suml)//判断是否加的是负数
        {
            suml = sum;
        }
    }
    sum = 0;
    for(int i = mid + 1; i <= r; i++)//找出右边最大的数字,赋值于sumr
    {
        sum = sum + s[i];//代表右边数字的累加
        if(sum > sumr)//判断是否加的是负数
        {
            sumr = sum;
        }
    }
    Max = suml + sumr;//这是一个整部分最大值
    Max = max(Max,leftmax);//找寻左边最大值和整部分最大值
    Max = max(Max,rightmax);//找寻右边最大值和整部分最大值
    return Max;
}
int main()
{
    int n;
    int sum = 0;
    int s[50010];
    scanf("%d", &n);
    for(int i = 1; i < n; i++)
    {
        scanf("%d", &s[i]);
    }
    sum = getmax(s,0,n-1);
    printf("%d %d\n", sum, cnt);
    return 0;
}


相关文章
|
6月前
|
人工智能
顺序表应用7:最大子段和之分治递归法
顺序表应用7:最大子段和之分治递归法
|
6月前
|
人工智能
顺序表应用8:最大子段和之动态规划法
顺序表应用8:最大子段和之动态规划法
|
算法
【算法专题突破】双指针 - 三数之和(7)
【算法专题突破】双指针 - 三数之和(7)
47 0
|
1月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
算法:分治思想处理归并递归问题
算法:分治思想处理归并递归问题
|
6月前
|
算法
递归算法实现二分查找
本文简要介绍了递归实现的二分查找算法,这是一种在有序列表中快速查找的策略。递归方法虽在实际应用中较少,但有助于理解递归思想,为学习数据结构中的树内容打下基础。文中提供了原版和递归版本的二分查找代码,并强调了递归算法中处理未找到情况的注意事项。此外,还提到了递归在解决复杂问题时的优势,并通过链接分享了一个关于递归实现素数判断的例子。
83 2
|
6月前
|
算法 索引
算法思想总结:二分查找算法
算法思想总结:二分查找算法
|
6月前
|
存储 搜索推荐
【非递归版】快速排序算法(4)
【非递归版】快速排序算法(4)
42 0
二分法查找(非递归)
二分查找法是查找算法里面,经典又比较简单的一种。它适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再查找。 二分查找法的运行时间为对数时间O(㏒₂n),即查找到需要的目标位置最多只需要㏒₂n 步。假设从[0, 99]的队列(100 个数,即 n=100)中寻到目标数 30,则需要查找步数为㏒₂100 , 即最多需要查找 7 次( 26 < 100 < 27)。