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

Problem Description

 给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。

 

注意:本题目要求用分治递归法求解,除了需要输出最大子段和的值之外,还需要输出求得该结果所需的递归调用总次数。

 

递归调用总次数的获得,可以参考以下求菲波那切数列的代码段中全局变量count的用法:

#include
int count=0;
int main()
{
    int n,m;
    int fib(int n);
    scanf("%d",&n);
    m=fib(n);
    printf("%d %d\n",m,count);
    return 0;
}
int fib(int n)
{
    int s;
    count++;
    if((n==1)||(n==0)) return 1;
    else s=fib(n-1)+fib(n-2);
    return s;
}
 

Input

第一行输入整数n(1<=n<=50000),表示整数序列中的数据元素个数;

第二行依次输入n个整数,对应顺序表中存放的每个数据元素值。

Output

一行输出两个整数,之间以空格间隔输出:

第一个整数为所求的最大子段和;

第二个整数为用分治递归法求解最大子段和时,递归函数被调用的总次数。

Example Input

6
-2 11 -4 13 -5 -2

Example Output

20 11



#include<iostream>
#include<cstdio>
using namespace std;
int  count=0;
int a[50010];
int Max(int a[],int l,int r)
{
     int k,sum=0;
     count++;
     if(l==r)
        return a[1]>0?a[1]:0;
     else
      {
           int mid=(l+r)/2;
           int lMax=Max(a,l,mid);
           int rMax=Max(a,mid+1,r);
           int max1=0;
           int lefts=0;
           for(k=mid;k>=l;k--)
           {
               lefts+=a[k];
               if(lefts>max1)
                max1=lefts;
           }
           int max2=0;
           int rights=0;
           for(k=mid+1;k<=r;k++)
           {
               rights+=a[k];
               if(rights>max2)
                max2=rights;
           }
           sum=max1+max2;
           if(sum<lMax)
            sum=lMax;
           if(sum<rMax)
            sum=rMax;
      }
      return sum;
}
int main()
{
     int n,max;
     scanf("%d",&n);
     for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
     max=Max(a,1,n);
     if(max<0)
        max=0;
     printf("%d %d\n",max,count);
     return 0;
}



#include <iostream>
#include<cstdio>
using namespace std;


int main()
{
  int sum=0,max=0;
    int n;
    scanf("%d",&n);
    int a[100001];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
        if(sum<0)
        sum=0;
        if(sum>max)
            max=sum;
    }
    printf("%d\n",max);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebMagic写的网络爬虫优秀文章

博客地址: https://www.cnblogs.com/yanduanduan/p/6527359.html https://www.cnblogs.com/tibit/p/7136762.html https://blog.csdn.net/qq_36251958/article/details/79313035#commentBox

向量内积(点乘)和外积(叉乘)概念及几何意义

向量的内积&#xff08;点乘&#xff09; 定义 概括地说&#xff0c;向量的内积&#xff08;点乘/数量积&#xff09;。对两个向量执行点乘运算&#xff0c;就是对这两个向量对应位一一相乘之后求和的操作&#xff0c;如下所示&#xff0c;对于向量a和向量b&#xff1a; a和b…

SVN分支/合并

转自&#xff1a;https://blog.csdn.net/e3002/article/details/21469437 先说说什么是branch。按照Subversion的说法&#xff0c;一个branch是某个development line&#xff08;通常是主线也即trunk&#xff09;的一个拷贝&#xff0c;见下图&#xff1a; branch存在的意义在…

全国省市直辖市列表

爬取来源&#xff1a;http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2015/34.html 结果&#xff1a; 云南省 昆明市/曲靖市/玉溪市/保山市/昭通市/丽江市/普洱市/临沧市/楚雄彝族自治州/红河哈尼族彝族自治州/文山壮族苗族自治州/西双版纳傣族自治州/大理白族自治州/德宏傣…

prim算法 求最小生成树

最小生成树Prim算法理解 标签&#xff1a; Prim算法理解最小生成树Prim2014-08-16 18:49 18482人阅读 评论(5) 收藏 举报版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 MST&#xff08;Minimum Spanning Tree&#xff0c;最小生成树&#xff09;问…

Hadoop视频教程资源链接

一 慕课网 1.Hadoop大数据平台架构与实践–基础篇(已学习) 链接:https://www.imooc.com/learn/391 2.Hadoop进阶&#xff08;已学习&#xff09; 链接:https://www.imooc.com/learn/890 二 极客学院 1.Hadoop 概述(已学习) 链接:http://www.jikexueyuan.com/course/677.html 2…

Unity大密度建筑场景加载解决方案

现在虚拟城市仿真&#xff0c;以及军事仿真项目越来越多&#xff0c;开发此类项目&#xff0c;首先面对的一个比较棘手的问题是内存管理&#xff0c;城市中的建筑物特别多&#xff0c;这些建筑物的面数和贴图都要被加到内存中的&#xff0c;内存有自己的峰值&#xff0c;超过了…

poj 1836 Alignment

题目大意&#xff1a; 给定一排人的身高&#xff0c;求踢出最少的人可以使队列身高如下形状&#xff1a; Description In the army, a platoon is composed by n soldiers. During the morning inspection, the soldiers are aligned in a straight line in front of the capta…

Qt程序崩溃原因

Qt写的程序在执行过程中莫名其妙的出现崩溃&#xff0c;代码没有任何问题。最后发现原因是因为Release版本的程序链接了Debug版的lib文件&#xff0c;所以导致程序执行过程中莫名其妙的出现崩溃。此类错误出现了很多次了&#xff0c;查找起来异常困难&#xff0c;需要注意&…

【转载】jvm内存回收

1.java的内存 java的内存结构分为 堆 (是gc的主要区域) 线程共享,主要是用于分配实例对象和数组 栈 线程私有,它的生命周期和线程相同,又分成 虚拟机栈和本地方法栈,只有它会报 StackOverFlowError,栈深度超标 方法区 线程共享 用于储存被虚拟机加载的类的信息,静态变量 常量和…

2016杭州ccpc

Kingdom of Obsession 标签&#xff1a; 二分图最大匹配2016-10-29 16:23 51人阅读 评论(2) 收藏 举报分类&#xff1a;二分图和最大匹配&#xff08;2&#xff09; 版权声明&#xff1a;本文为棒&#xff08;xian&#xff09;棒&#xff08;yu&#xff09;博主原创文章&#x…

深入理解C语言的函数调用过程

本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程&#xff0c;以加深对一些基础知识的理解。 先看一个最简单的程序&#xff1a; 点击(此处)折叠或打开 /*test.c*/#include <stdio.h> int foo1(int m,int n,int p){ int x m n p; …

【转载保存】RunTime.getRunTime().addShutdownHook 添加钩子

https://blog.csdn.net/gongxinju/article/details/69963099

Unity3D打包后日志文件输出目录

Unity3D打包后日志文件输出目录&#xff0c;包括日志文件和崩溃时记录文件 C:\Users\Administrator\AppData\LocalLow\长沙迪迈科股份有限公司\镍矿探秘 其中"..\长沙迪迈科股份有限公司\镍矿探秘" 为unity的公司和产品设置

【转载保存】Jsoup使用

https://blog.csdn.net/ricky73999/article/details/54989972

Unity3d LookAt参数说明

Unity3d LookAt参数说明 //// 摘要: // Rotates the transform so the forward vector points at targets current position.//// 参数: // target:// Object to point towards.//// worldUp:// Vector specifying the upward direction.public void LookAt(…

SteamVR导致场景相机不正常

在Unity3D项目中导入SteamVR和VRTK后&#xff0c;有时候会导致非VR场景中的相机运行后异常&#xff0c;姿态和位置不对。 导致的原因可能是&#xff0c;工程设置不对&#xff08;SteamVR和VRTK依赖一些预定义宏&#xff09;&#xff0c;需要将相应的工程设置ProjectSettings文…

【转载保存】java优先队列使用

PriorityBlockingQueue是一个带优先级的阻塞队列,提供了阻塞获取操作。元素按优先级顺序被移除&#xff0c;该队列也没有上限&#xff08;看了一下源码&#xff0c;PriorityBlockingQueue是对 PriorityQueue的再次包装&#xff0c;是基于堆数据结构的&#xff0c;而PriorityQue…

【转载保存】HtmlUnit的使用

信息来源&#xff1a; https://blog.csdn.net/moneyshi/article/details/78799949 https://blog.csdn.net/qq_36176250/article/details/77199595