大家好,我是小鸭酱,博客地址为: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. 使用NSTimer实现倒计时-备

    今天在CocoaChina上面看到有人在问倒计时怎么做,记得以前在看Iphone31天的时候做过一个,今天翻出来运行不了了,原因是我的IphoneSDK升级到3.1了,以前使用的是2.2.1,在2.2 ...

  2. Codeforces 545C Woodcutters

    http://codeforces.com/contest/545/problem/C 题目大意: 给n棵树的在一维数轴上的坐标,以及它们的高度.现在要你砍倒这些树,树可以向左倒也可以向右倒,砍倒的树 ...

  3. Leetcode_Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  4. Qt 的信号与槽机制介绍(10个要注意的问题)

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  5. 关于老驱动不能在windows 8下正常安装的问题

    问题: 老驱动(WDF),能在windows 7下安装并工作,但是不能在windows 8下安装. 先了解下windows 8驱动的新东西吧: New for windows 8 http://msd ...

  6. 深入理解Java的protected修饰符

    其实Java的protected修饰符,权限定义的很微妙,大致有以下几种: (1)protected控制符用于修饰方法和成员变量: (2)一个类的protected方法或成员变量,在包外是不能通过该类 ...

  7. phpcms:七、list.html

    1.列表页{pc:content action="lists" catid="$catid" num="25" order="id ...

  8. Eclipse调试时出现source not found的问题

    Eclipse中新加载了一个java项目,打断点debug时,Debug小窗口显示source not found,网搜找到了解决办法,在此记录一下. 原文地址:http://blog.csdn.ne ...

  9. 小米路由器mini建FTP

    输入命令 df -h 复制代码 查看自己的分区路径,我自己用了一个闲置笔记本电脑硬盘转USB,插到mini,有四个区 为了方便,我选择把ftp安装在第一个分区  /extdisks/sda1/ 创建f ...

  10. oracle插入特殊字符&#39;&amp;&#39;问题

    oracle转义字符开关:set define off   /   show define