最大子段和——用蛮力算法,分治策略,动态规划算法三种求法(C语言)

目录

一、题目

二、算法求解

1、蛮力算法

伪代码

 算法分析

程序

2、分治策略

伪代码

算法分析

程序

3、动态规划算法

伪代码

算法分析

程序


一、题目

设A=<a1,a2,...,an>是n个整数的序列,称<ai,....,aj>为该序列的连续子序列,其中1<=i<=j<=n,子序列的元素之和\sum_{k=i}^{j} a_{k}称为A的子段和:

例如,A=<-2,11,-4,13,-5,-2>,那么它的子段和如下:

长度为1的子段和有:-2,11,-4,13,-5,-2

长度为2的子段和有:9,7,9,8,-7

长度为3的子段和有:5,20,4,6

长度为4的子段和有:18,15,2

长度为5的子段和有:13,13

长度为6的子段和有:11

其中的最大子段和为:11-4+13=20

则最大子段和问题为:

给定n个整数的序列A=<a1,a2,...,an>,求

二、算法求解

1、蛮力算法

通过枚举A的所有连续子序列并且求和,通过比较找出具有最大和的子序列。

伪代码

//算法 Enumerate
//输入:数组A[1..n]
//输出:sum,first,last   //sum为最大子段和,first与last分别是和的首末位置

  1. sum\leftarrow 0
  2. for \quad i\leftarrow 1 \quad to \quad n \quad do
  3.       for \quad j\leftarrow 1\quad to \quad n \quad do
  4.                 thissum\leftarrow 0
  5.                for \quad k\leftarrow i \quad to \quad j \quad do
  6.       if \quad thissum>sum
  7.       then \quad sum\leftarrow thissum
  8.                 first\leftarrow i
  9.                 last\leftarrow j

 算法分析

3个for循环,每次执行O(n)次,循环内部是常数操作,所以该算法的时间复杂度为O(n^{3})

程序

//算法3.8 Enumerate
//输入:数组A[1..n]
//输出:sum,first,last

#include<stdio.h>
#include<stdlib.h>
void Enumerate (int a[],int n)
{
	int
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值