分治法求最大子列和

news/2024/12/28 21:37:00/

给定N个整数的序列{ A1, A2, …, AN},其中可能有正数也可能有负数,找出其中连续的一个子数列(不允许空序列),使它们的和尽可能大,如果是负数,则返回0。使用下列函数,完成分治法求最大子列和。

    • 这是自己大一暑假写的逐次遍历的方法
    • 以下是分而治之的方法

题目如标题,题目用到了分而治之的算法思想,以下是分而治之的定义:

“分而治之”(Divide andConquer)
是一种算法设计思想,它将一个大问题分解成相互独立且相似的子问题,然后递归地解决这些子问题,最后将它们的解合并起来得到原问题的解。这种策略通常包括三个步骤:

分解(Divide): 将原问题分解为若干个规模较小且相互独立的子问题。

解决(Conquer): 递归地解决这些子问题。如果子问题足够小,可以直接求解。

合并(Combine): 将子问题的解合并起来,形成原问题的解。

分而治之的思想常常应用在解决复杂问题的过程中,它可以提高算法的效率。一些著名的算法,如归并排序、快速排序、二分查找等,都是采用了分而治之的策略。这种思想在许多计算机科学和算法领域都有广泛的应用。此题目就是用了分而治之中的二分法,改善了题目的时间复杂度

这是自己大一暑假写的逐次遍历的方法

时间复杂度是O(n²)

#include<stdio.h>
#define MAX 100000
int main()
{int i,j,n,maxSum,tempSum,a[MAX];//定义数组大小的新方法,即通过宏定义 scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);}maxSum=0;for(i=0;i<n;i++){tempSum=0;//保证每个初始值为0 for(j=i;j<n;j++)//循环不止有计数功能,有数组时,一定要注意下标 {tempSum+=a[j];if(tempSum>maxSum)//核心问题:可以算一步,判断一步 maxSum=tempSum;}}printf("%d",maxSum);	}

以下是分而治之的方法


T ( N ) =O( N log N )
int MaxSum(int a[],int left,int right);
int threeOfMax(int a1,int a2,int a3);
int centerMaxSum(int a[],int left,int right);```c

在这里插入图片描述

#include<stdio.h>
#define N 50
int MaxSum(int a[],int left,int right);
int centerMaxSum(int a[],int left,int right);
int threeOfMax(int a1,int a2,int a3);
int main(){int n;int a[N];printf("请设置数组位数n:\n");scanf("%d",&n);printf("请输入数值:\n");for(int i = 0;i<n;i++){scanf("%d",&a[i]);}int left=0;int right=n-1; int maxSubSum = MaxSum(a,left,right);printf("最大子序列的和为:%d\n",maxSubSum);return 0;
} int MaxSum(int a[],int left,int right){int a1,a2,a3,i;int MaxLeftSum, MaxRightSum; //存放左右子问题的解int MaxLeftBorderSum, MaxRightBorderSum; //存放跨分界线的结果int LeftBorderSum, RightBorderSum;// 递归终止条件 直到分到最后一个元素 if(left==right){if( a[left] > 0 )return a[left];elsereturn 0;}int mid = (left+right)/2;// 划分左边a1 = MaxSum(a,left,mid);// 划分右边a2 = MaxSum(a,mid+1,right);// 求解s3 MaxLeftBorderSum = 0;LeftBorderSum = 0;for( i=mid; i>=left; i-- )   //从中线向左扫描{LeftBorderSum += a[i];if( LeftBorderSum > MaxLeftBorderSum )MaxLeftBorderSum = LeftBorderSum;} //左边扫描结束MaxRightBorderSum = 0;RightBorderSum = 0;for( i=mid+1; i<=right; i++ )   //从中线向右扫描{RightBorderSum += a[i];if( RightBorderSum > MaxRightBorderSum )MaxRightBorderSum = RightBorderSum;} //右边扫描结束 a3 =centerMaxSum(a,left,right);;//下面返回"治"的结果return threeOfMax( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum );}
// 求解s3 
int centerMaxSum(int a[],int left,int right){int leftSum = 0;int rightSum = 0;int templeftSum = 0;int temprightSum = 0;int mid=(left+right)/2;for(int i = mid;i>=left;i--){templeftSum = templeftSum+a[i];if(templeftSum>leftSum)leftSum=templeftSum; }for(int j = mid+1;j<=right;j++){temprightSum = temprightSum+a[j];if(temprightSum>rightSum)rightSum=temprightSum;}return leftSum+rightSum;
}// 求解最大的子列和 
int threeOfMax(int a1,int a2,int a3){int maxSum = a1>a2?a1:a2;return maxSum>a3?maxSum:a3;
}

摘自


http://www.ppmy.cn/news/1266087.html

相关文章

Python从入门到精通五:Python数据容器

数据容器入门 为什么学习数据容器 思考一个问题&#xff1a;如果我想要在程序中&#xff0c;记录5名学生的信息&#xff0c;如姓名。 如何做呢&#xff1f; 学习数据容器&#xff0c;就是为了批量存储或批量使用多份数据 Python中的数据容器&#xff1a; 一种可以容纳多份…

node笔记

文章目录 一、Node.js基础1. 认识Node.js01 nodejs的特性02 使用 Node.js 需要了解多少 JavaScript03 浏览器环境vs node环境 2. 开发环境搭建3. 模块、包、commonJS02 CommonJS规范03 modules模块化规范写法 4. Npm&Yarn01 npm的使用02 全局安装 nrm03 yarn使用 5. 内置模…

MySQL系列(一):索引篇

为什么是B树&#xff1f; 我们推导下&#xff0c;首先看下用哈希表做索引&#xff0c;是否可以满足需求。如果我们用哈希建了索引&#xff0c;那么对于如下这种SQL&#xff0c;通过哈希&#xff0c;可以快速检索出数据&#xff1a; select * from t_user_info where id1;但是这…

【开题报告】基于SpringBoot的美食探店分享平台的设计与实现

1.研究背景 随着互联网的普及和移动设备的快速发展&#xff0c;人们对美食的需求和探索欲望不断增长。越来越多的人愿意通过网络平台来寻找、分享和评价各种美食&#xff0c;以满足自己的口腹之欲和探索新鲜感。 而传统的美食指南、餐厅推荐等方式已经无法满足用户多样化的需…

TCP数据粘包的处理

TCP数据粘包的处理 背锅侠TCP解决方案2.1 发送端2.2 接收端 背锅侠TCP 在前面介绍套接字通信的时候说到了TCP是传输层协议&#xff0c;它是一个面向连接的、安全的、流式传输协议。因为数据的传输是基于流的所以发送端和接收端每次处理的数据的量&#xff0c;处理数据的频率可…

HubSpot细分目标市场:拓展业务边界,突破增长瓶颈

在数字化时代&#xff0c;企业面临前所未有的市场挑战。随着科技的飞速发展&#xff0c;消费者期望个性化的体验&#xff0c;即时的互动&#xff0c;以及高质量、有价值的信息。这些变化使得企业不仅需要适应新的技术和趋势&#xff0c;还需要更加精细化地理解和满足不同细分市…

Linux Server Quick Command

Linux Server Quick Command 查看服务器gpu情况&#xff1a;gpustat conda install gpustat nvidia-smi也可以监控 实时监控gpu状态&#xff1a; 进入后台运行&#xff1a;$ tmux &#xff08;tmux使用方法&#xff09; 退出当前窗口&#xff1a;先按下ctrlb&#xff0c;再按下…

达梦数据库dm8守护集群部署手册

环境说明 操作系统&#xff1a;liunx-centos7.6 服务器&#xff1a;3台虚拟机&#xff08;主备数据库各一台&#xff0c;监视器一台(可选)&#xff09; 达梦数据库版本&#xff1a;达梦V8 一、安装前准备工作 参考达梦官方文档&#xff1a;https://eco.dameng.com/documen…