大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang

以下实现最大子数组的分治策略,算法来自《算法导论》

#include<iostream>
using namespace std;
 
struct ans
{
    int low;
    int high;
    int sum;
};
 
ans MAXIMUM_CROSSING_SBUARRAY(int * A, int low, int mid, int high)
{
    ans cross_ans = {mid, mid, INT_MIN};
    ans cross_left = {mid, mid, INT_MIN};
    ans cross_right = {mid + 1, mid + 1, INT_MIN};
    int sum = 0;
    for(int i = mid; i >= low; --i)
    {
        sum += A[i];
        if(cross_left.sum < sum)
        {
            cross_left.sum = sum;
            cross_left.low = i;
        }
    }
    sum = 0;
    for (int j = mid + 1; j <= high; ++j)
    {
        sum += A[j];
        if(cross_right.sum < sum)
        {
            cross_right.sum = sum;
            cross_right.high = j;
        }
    }
    cross_ans.low = cross_left.low;
    cross_ans.high = cross_right.high;
    cross_ans.sum = cross_left.sum + cross_right.sum;
    return cross_ans;
}
 
ans MAXIMUM_SUBARRAY(int * A, int low, int high)
{
    if(low == high)
    {
        ans myans = {low, high, A[low]};
        return myans;
    }
    else
    {
        int mid = (low + high) / 2;
        ans leftans = MAXIMUM_SUBARRAY(A, low, mid);
        ans rightans = MAXIMUM_SUBARRAY(A, mid + 1, high);
        ans crossans = MAXIMUM_CROSSING_SBUARRAY(A, low, mid, high);
        if(leftans.sum > rightans.sum && leftans.sum > crossans.sum)
            return leftans;
        else if(rightans.sum > leftans.sum && rightans.sum > crossans.sum)
            return rightans;
        else
            return crossans;
    }
}
 
int main()
{
    int b[] = {3, -2, 5, -7, 3, 1, 1,-4, 9, -3};
    ans mybestans = MAXIMUM_SUBARRAY(b, 0, 9);
    cout << "The sub_array's elements of b with the greatest sum is the element from "<< mybestans.low << " to " << mybestans.high << endl;
    cout << "The sum is " << mybestans.sum << endl;
    return 0;
}

最大子数组分治方案C++实现的更多相关文章

  1. 《剑指Offer》- 连续子数组的最大和或最小和

    前言 本文是<剑指Offer>系列(JavaScript版)的第一篇,题目是"连续子数组的最大和或最小和". 话不多说,开始"打怪"修炼... 一. ...

  2. 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题

    主要讲第五课的内容前缀树应用和第六课内容暴力递归改动态规划的最全步骤 第一题 给定一个数组,求子数组的最大异或和. 一个数组的异或和为,数组中所有的数异或起来的结果. 简单的前缀树应用 暴力方法: 先 ...

  3. Demo003 最大连续子数组问题(《算法导论》4.1-5)

    问题 问题描述  给定n个整数(可能为负数)组成的数组,要求一个数组连续下标和的最大值,数组的元素可正.可负.可为零.  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的 ...

  4. 笔试算法题(06):最大连续子数组和 & 二叉树路径和值

    出题:预先输入一个整型数组,数组中有正数也有负数:数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和:求所有子数组中和的最大值,要求时间复杂度O(n): 分析: 时间复杂度为线性表明只允许一 ...

  5. 剑指Offer(三十):连续子数组的最大和

    .# 剑指Offer(三十):连续子数组的最大和 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  6. 每日一题 - 剑指 Offer 42. 连续子数组的最大和

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 动态规划 难易程度:简单 题目描述: 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求 ...

  7. [LeetCode] Minimum Size Subarray Sum 最短子数组之和

    Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...

  8. 剑指Offer面试题:28.连续子数组的最大和

    一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3 ...

  9. lintcode循环数组之连续子数组求和

    v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. ...

随机推荐

  1. delegate,notifucation,KVO三种模式实现通信的优缺点

             在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delega ...

  2. AFNetworking 使用总结 (用法+JSON解析)

    « AFNetworking 图片的本地缓存问题 Get application bundle seed ID in iOS » AFNetworking 使用总结 (用法+JSON解析)    Fr ...

  3. Swift字符串的插入、删除和替换-备

    对应可变字符串可以插入.删除和替换,String提供了几个方法可以帮助实现这些操作.这些方法如下: splice(_:atIndex:).在索引位置插入字符串. insert(_:atIndex:). ...

  4. [每日一题JS] 正则表达式

    判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母.数字.下划线,总长度为5-20 var reg = /\b[a-zA-Z]{1}[a-zA-Z0-9_]{4,19}\b/; var fl ...

  5. 为什么Linux不需要碎片整理?

    如果你是一个 Linux 用户,你可能会听说 Linux 的文件系统不需要碎片整理.你也可能会注意到 Linux 的发行版本也都没有磁盘碎片整理的功能.这是为什么呢? 要理解为什么 Linux 的文件 ...

  6. BZOJ2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 391  Solved: 127[Submi ...

  7. 【转】Windows 7/8/8.1 硬盘安装法实现 ubuntu 14.04 双系统

    原文网址:http://www.cnblogs.com/chenguangqiao/p/4219532.html 一.软件准备 1. 下载 Ubuntu 系统镜像:http://www.ubuntu. ...

  8. Delphi7下实现HTTP的Post操作 转

    Delphi7下实现HTTP的Post操作 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Gra ...

  9. spring加载properties配置文件

    public static void main(String[] args){    String path="E:/workspace/bocMarketData/src/config/P ...

  10. Entify Framewrok - LINQ简单使用

    1.如何使用Join: http://www.devcurry.com/2011/01/join-example-in-linq-and-c.html