大家好,我是小鸭酱,博客地址为: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. PYTHON线程知识再研习D---可重入锁

    不多解释,预防普通锁不正规的获取与释放 #!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time class ...

  2. java decompiler如何去掉行号

    今天想反编译jar包保存源代码,默认前面加了行号,不知道这个小工具如何设置去掉行号? 反编译后: 找到它的安装路径,我的是:C:\Program Files\decomp.然后将该路径加入到环境变量p ...

  3. Oracle 11gR2 RAC Votedisk and OCR Diskgroup Recovery

    check votedisk and OCR [root@vzwc1 ~]# ocrcheck Status of Oracle Cluster Registry is as follows : Ve ...

  4. XSS初体验

    主要内容 什么是XSS? XSS的危害有哪些? 常见的XSS漏洞 如何防范XSS?   什么是XSS? 跨站脚本攻击(Cross Site Scripting),是一种 Web 应用程序的漏洞,当来自 ...

  5. DirectX Sample-Blobs实现原理

    这个例子的实现主要包括两步: 1.计算三维采样坐标和color,实现代码是for( i = 0; i < NUM_Blobs; ++i )那个循环,计算完成以后g_pTexGBuffer[0]保 ...

  6. JavaScript运算符有哪些

    JavaScript中的运算符有很多,主要分为算术运算符,等同全同运算符,比较运算符,字符串运算符,逻辑运算符,赋值运算符等.这些运算符都有一些属于自己的运算规则,下面就为大家介绍一下JavaScri ...

  7. angularjs基本执行流程

    近期温习了下angularjs执行流程,备记下.以便查看. 主要的执行流程例如以下: 1.用户请求应用起始页. 2.用户的浏览器向server发起一次HTTP连接,然后载入index.html页面,这 ...

  8. java通过jsp的Excel导出

    在项目中一般导出报表用poi,可是假设你不想用框架就用简单的jsp也能够实现报表导出.并且实现起来还特别简单. 先看一下效果截图: 点击导出后的效果截图: 详细实现: 第一:在页面的列表页面中就是普通 ...

  9. LR翻页脚本并在每页实现业务操作

    性能需求:在列表中删除后有记录,或对列表中的每条记录进行操作(如点击每条记录的“单号”进入订单详情页面,或在列表中对每条记录进行“启用”.“停止”操作) 举例:Vuser脚本模拟用户在订单列表中点击每 ...

  10. C# 初识Ref和Out

    首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...