求解最大连续子序列和问题———分治法
一、问题描述
给定一个有n(n >= 1)个整数的序列,求出其中最大连续子序列的和。例如序列(34,-20,30,-50,60,-20,30,41,-30,-10)最大子序列和为111,序列(-2,11,-4,13,-5,-2)最大子序列和为20。规定一个序列的最大连续子序列和至少为0。
二、问题求解
1、对于含有n个整数的序列,若n=1,表示序列仅有一个元素,该元素大于0,则返回该元素,否则返回0。
if(left == right){if(a[left]>=0)return a[left];elsereturn 0;
}
2、如果n>1,则采用分治法求解最大连续子序列和。取中间位置 mid = ( left + right ) /2 。则最大连续子序列和只可能出现在3个地方。
- ①该子序列全部落在左半部分,即a[0,···mid]中,该问题和原本问题解决方法一样,采用递归求出其最大连续子序列和maxLeftSum。
- ②该子序列全部落在右半部分,即a[mid+1,···n-1]中,该问题和原本问题解决方法一样,采用递归求出其最大连续子序列和maxRightSum。
- ③该子序列跨越序列a的中部而占据左右两部分。也就是说,这种情况下的最大连续子序列和必然包括mid元素,则先求出maxLeftBorderSum,从mid(终点)到left的最大连续子序列和,找到左边最大连续子序列和的起点位置,将左边到mid的最大连续子序列和赋值给maxLeftBorderSum。再求出maxRightBorderSum,从mid(起点)到right的最大连续子序列和,找到右边最大连续子序列和的终点位置,将mid到右边的最大连续子序列和赋值给maxRightBorderSum。这种情况下的最大连续子序列和为 maxMidSum =maxLeftBorderSum+maxRightBorderSum
3、整个序列a的最大连续子序列和为maxMidSum 、maxLeftBorderSum、maxRightBorderSum。将三者进行大小比较即为最终结果。
三、完整代码展示(C语言)
//求解最大连续子序列和问题
#include<stdio.h>
int num[10] = {34,-20,30,-50,60,-20,30,41,-30,-10};
//int num[6] = {-2,11,-4,13,-5,-2};
int max3(int a,int b,int c){ //求三者的最大值if(a < b)a = b;if(a < c)a = c;return a;
}
int maxSubSum(int a[],int left,int right){int i,j;int maxLeftSum,maxRightSum;int maxLeftBorderSum,leftBorderSum;int maxRightBorderSum,rightBorderSum;if(left == right){ //只有一个元素的情况if(a[left]>=0) return a[left];elsereturn 0;}int mid = (left+right)/2; //取中间位置maxLeftSum = maxSubSum(a,left,mid); //求左边的最大序列和maxRightSum = maxSubSum(a,mid+1,right); //求右边的最大序列和maxLeftBorderSum = 0;leftBorderSum = 0;maxRightBorderSum = 0;rightBorderSum = 0;
//最大连续子序列在序列a的中部而占据左右两部分情况for(i=mid;i>=left;i--){ //求mid到左边的maxLeftBorderSumleftBorderSum += a[i];if(maxLeftBorderSum < leftBorderSum)maxLeftBorderSum = leftBorderSum;}for(j=mid+1;j <= right;j++){ //求mid到右边的maxRightBorderSumrightBorderSum += a[j];if(maxRightBorderSum < rightBorderSum)maxRightBorderSum = rightBorderSum;}return max3(maxRightBorderSum,maxLeftBorderSum,maxLeftBorderSum+maxRightBorderSum);
}int main(){printf("maxSubSum= %d\n",maxSubSum(num,0,9));return 0;
}
求解最大连续子序列和问题———分治法相关推荐
- 求解最大连续子序列和问题(Java)蛮力法+分治法
求解最大连续子序列和问题 [问题描述] 给定一个有n(n>=1)个整数的序列,要求求出其中最大连续子序列的和. [样例输入] 6 -2 11 -4 13 -5 -2 [样例输出] 20 [问题求 ...
- 蛮力法 —— 求解最大连续子序列和问题
问题:求解最大连续子序列和问题 题目: 给定一个有n(n>=1)个整数的序列,求解其中最大连续子序列的和.规定一个序列的最大子序列和至少为0,若结果小于0,则其结果为0 例:序列(-2,11,- ...
- 求解最大连续子序列和问题----蛮力法
文章预览 问题:求解最大连续子序列和问题 思路一:穷举法 思路二:穷举法 思路三:穷举法 问题:求解最大连续子序列和问题 题目: 给定一个有n(n>=1)个整数的序列,求解其中最大连续子序列的和 ...
- 算法分析:采用蛮力法(循环) 求解最大连续子序列和问题。给定一个有n(n≥1)个整数的序列,要求求出其中最大连续子序列的和。 例如: 序列(-2,11,-4,13,-5,-2)
一.效果图 二.源代码 package sy4; import java.util.Scanner; /** * @author * */ public class Sy4_2 { static vo ...
- 【算法】求解最大连续子序列和问题
程序代码: #include <stdio.h> #define max(x,y) ((x)>(y)?(x):(y)) #define MAXN 20 //问题表示 int n = ...
- 【算法】求解最大连续子序列和的问题
#include <stdio.h> long max3(long a, long b, long c) //求出3个long中的最大值 {if (a > b) a = b; //用 ...
- 动态规划法求解最大连续子序列和问题
问题描述 给定一个有n(n≥1)个整数的序列,要求求出其中最大连续子序列的和. 例如 序列(-2,11,-4,13,-5,-2)的最大子序列和为20 序列(-6,2,4,-7,5,3,2,-1,6,- ...
- 蛮力法求解最大连续子序列和问题
问题描述 给定一个有n(n≥1)个整数的序列,要求求出其中最大连续子序列的和. 例如: 序列(-2,11,-4,13,-5,-2)的最大子序列和为20 序列(-6,2,4,-7,5,3,2,-1,6, ...
- 四种解法——求子序列的最大连续子序和(普通解法、求和解法、分治法、O(n)级解法)(面试经典题)
励志用少的代码做高效表达 在这四种解法里,解法一是通法,可以学到规律和知识,做基础之用:解法二在解法一的基础上做改进,锻炼思维:解法三则是大名鼎鼎的分治法,涉及到递归的知识,算是"高效算法设 ...
- 《github一天一道算法题》:分治法求数组最大连续子序列和
看书.思考.写代码. /**************************************** copyright@hustyangju * blog: http://blog.csdn.n ...
最新文章
- 为什么做好数据安全这么难?黑客太牛?
- vue可视化拖拽生成工具_vue实现可视化可拖放的自定义表单的示例代码
- mysql sign_mysql - 随笔分类 - signheart - 博客园
- Robust line matching through line–point invariants
- 一文看懂:边缘计算究竟是什么?为何潜力无限?(上)
- 想做个磁力链搜索引擎 1
- 图片分享和加载失败的原因之一
- Python编码错误的解决办法SyntaxError: Non-ASCII character '\xe5' in file
- Pycharm配置(1)——解释器(interpreter)
- 一文看懂韦恩图和欧拉图的不同
- 【福利】小程序开发资源干货汇总
- 乐高机器人纲要_人工智能与机器人课程纲要
- matlab如何镜像处理图片,matlab实现图像镜像
- Unity简单实现老虎机抽奖效果
- 计算机开机屏幕英语,电脑开机进不了系统,屏幕一堆英文数字怎么办?别急有方法...
- 联合搜索:搜索中的所有需求
- 新版Zotero插件更新
- Python网络爬虫学习实战:爬虫快速入门
- yolov5跌倒检测。可以检测跌倒,坐立,下蹲,正常行走。可 以绘制各种训练指标曲线。
- vegas不可识别格式素材怎么处理?
热门文章
- MySQL小数数据类型
- OpenGl 之学习笔记 glNormal3f 函数理解和光源相关知识总结
- 三十.基于国民MCU 的COMP与ADC结合的实战功能模拟案例
- JavaScript的prototype是什么?
- Elasticsearch:Apache spark 大数据集成
- 2012年真的是世界末日吗?_全球关注
- Ubuntu 20.04 + mysql 8.0.27 用户名和密码修改(非常实用)
- Word一行有空白格,却无法输入新的文字
- 龙门浩职高计算机学校,重庆市龙门浩职业中学校|龙门浩职高是公办还是民办院校/文凭怎么样/是什么性质...
- SDI科普--- SD-SDI/HD-SDI/3G-SDI/12G-SDI