最大子段和之分治递归法
最大子段和之分治递归法
Time Limit: 10 ms Memory Limit: 400 KiB
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((n1)||(n0)) return 1;
else s=fib(n-1)+fib(n-2);
return s;
}
Input
第一行输入整数n(1<=n<=50000),表示整数序列中的数据元素个数;
第二行依次输入n个整数,对应顺序表中存放的每个数据元素值。
Output
一行输出两个整数,之间以空格间隔输出:
第一个整数为所求的最大子段和;
第二个整数为用分治递归法求解最大子段和时,递归函数被调用的总次数。
Sample Input
6
-2 11 -4 13 -5 -2
Sample Output
20 11
Hint
Source
/*****
分治
要么左半取最大,要么右半去最大,要么两边合起来去最大
(感觉在说废话)
用cin,cout可能会超时。
******/
#include <iostream>
#include <cstdio>
using namespace std;
const int max1 = 50001;
int a[max1];
int count1,n;
int f(int l,int r)
{int sum=0;count1++;if(l == r){if(a[l] >= 0)sum = a[l];elsesum = 0;}else{int mid = (l+r)/2;int leftsum = f(l,mid); ///求左半最大和int rightsum = f(mid+1,r);///右半最大和int sum0,sum1,sum2;sum0 = sum1 = 0;for(int i = mid; i >= l; i--) ///以下代码都是求中间的最大和{sum0+=a[i];if(sum0 > sum1)sum1 = sum0;}sum0 = sum2 =0;for(int i = mid+1; i <= r; i++){sum0+=a[i];if(sum0 > sum2)sum2 = sum0;}sum = sum1+sum2; ///中间最大和sum = max(sum,leftsum);sum = max(sum,rightsum);}return sum;
}
int main()
{int n;scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&a[i]);}int sum = f(1,n);printf("%d %d\n",sum,count1);return 0;
}
最大子段和之分治递归法相关推荐
- 顺序表应用7:最大子段和之分治递归法
Description 给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最 ...
- c 最大子序列和_最大子序列和暴力法、分治+递归法、妙法
你好,我是goldsunC 让我们一起进步吧! 最大子序列和 Question:给定整数(可能有负数),求的最大值(为方便起见,如果所有整数均为负数,则最大子序列和为0). 示例: IN : [-2, ...
- 函数传参问题,桶排序去重,分治递归,摩尔投票求数组众数,数组中心下标求法
TIPS 1. 我们都知道,地址,指针这两者是完全等价的概念,但是有微小的差别.地址的话是不能够修改的(比如说数组名++就是违法的),而指针的话可以++与--. 2. 以后一旦在代码里面看到字符cha ...
- c语言上20级台阶递归法,c语言递归算法.pptx
计算机语言与程序设计;第八章 递归算法;从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,老和尚正在给小和尚讲故事.讲的是什么故事呢?他说,从前--;Recursion- See "Re ...
- 常见算法思想3:递归法
递归法 在计算机编程应用中,我们常常遇到代码的递归调用,事实上,递归是一种编程技巧,它是分治思想的一种重要体现.递归算法对解决大多数问题是十分有效的,它能够使算法的描述变得简洁而且易于理解. 从直观上 ...
- c语言递归方法排序,归并排序,递归法,C语言实现。
利用归并排序法对序列排序的示意图(递归法): 一.算法分析:利用递归的分治方法:1.将原序列细分,直到成为单个元素:2.在将分割后的序列一层一层地按顺序合并,完成排序.细分通过不断深入递归完成,合并通 ...
- 算法笔记方法论3 递推法与递归法
你站在桥上看风景看风景的人在楼上看你明月装饰了你的窗子你装饰了别人的梦--卞之琳 递推算法的特点 一个问题的求解需要大量重复计算,在已知的条件和所求问题之间总存在着某种相互联系的关系,在计算时,我们需 ...
- 用递归法计算斐波那契数列的第n项
斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...
- 二叉树-对称二叉树(递归法)
题意: 给定一个二叉树,检查它是否是镜像对称的. 中间划开,看是否对称 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / 2 2 / \ / 3 4 4 3 思路:(递归法) 这里镜像 ...
最新文章
- 视频|结构光编码与三维重建
- 湘潭大学c语言答案,湘潭大学生c语言课后习题答案.doc
- http://www.openwebx.org/docs/turbine.html
- 如何设置Winform控件的ClientRectangle
- Android 11 修改libcore Cipher AS测试
- CRM One Order search max hit实现原理讨论
- 程序员你写的代码,被人挖出了黑产
- python代理charles_Mitmproxy + Python 做拦截代理
- Knapsack Cryptosystem【折半+查找】
- java string的某个字符_JAVA如何提取String中字符串的某个字符 具体内容
- Raphael的transform用法
- 我们眼中的资管管理行业三要素
- alidoing --使用JS实现多语言框架、喜欢的请进、、瓦特平台!
- HOUDINI OPENCL 错误
- Linux, CentOS7 安装并打开最新版firefox浏览器
- EDA12--DC脚本命令(一)
- 线性代数 | (1) 矩阵Part One
- 如何使用git创建项目,创建分支
- 计算机重启遇到你的账户已被停用,win10 administrator你的账户已被停用怎么办
- 数字图像处理 第二章数字图像基础
热门文章
- python学爬虫还是人工_本人初二生,学习Python爬虫,要不要继续深入学习啊?
- @value注解取不到值_教学笔记:Java注解及自定义注解示例
- python中reshape_python numpy reshape用法及代码示例
- mac安装gnu make_Linux Make的使用以及命令安装详解
- LeetCode:67. 二进制求和(python、c++)
- numpy.arange()官方用法详解(附numpy官方文档)
- PAT 乙级1014	福尔摩斯的约会(C语言)
- 将coco数据集转为voc格式代码
- 编译FriendlyDesktop的Uboot源码、内核,修改开机图片logo
- 模版 ----- 一维指数型枚举 排列型枚举 组合型枚举