顺序表应用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;
}


相关文章
|
7月前
|
人工智能
顺序表应用7:最大子段和之分治递归法
顺序表应用7:最大子段和之分治递归法
|
7月前
|
人工智能
顺序表应用8:最大子段和之动态规划法
顺序表应用8:最大子段和之动态规划法
|
6月前
|
存储 算法 数据可视化
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
|
7月前
快速排序详解(递归实现与非递归实现)
快速排序详解(递归实现与非递归实现)
|
7月前
|
存储 搜索推荐
【非递归版】快速排序算法(4)
【非递归版】快速排序算法(4)
51 0
递归和非递归分别实现求第n个斐波那契数
递归和非递归分别实现求第n个斐波那契数
71 0
非递归实现二叉树遍历
非递归实现二叉树遍历
54 0
|
算法
2-路归并排序的递归实现和非递归实现
2-路归并排序的递归实现和非递归实现
二分法查找(非递归)
二分查找法是查找算法里面,经典又比较简单的一种。它适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再查找。 二分查找法的运行时间为对数时间O(㏒₂n),即查找到需要的目标位置最多只需要㏒₂n 步。假设从[0, 99]的队列(100 个数,即 n=100)中寻到目标数 30,则需要查找步数为㏒₂100 , 即最多需要查找 7 次( 26 < 100 < 27)。