-->
当前位置:首页 > 题库 > 正文内容

程序填空题:最大子段和问题(分治法)

Luz4年前 (2021-05-10)题库1205
最大子段和问题。给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。

```c++
#include
#include
#include
using namespace std;
#define N 10001

long maxsubsum(int *a,int left,int right)
{
long sum=0;
if(left==right)
sum=@@[a[left]>0?a[left]:0](2);
else{
int center=(left+right)/2;
long leftsum=@@[maxsubsum(a,left,center)](2);
long rightsum=@@[maxsubsum(a,center+1,right)](2);
long s1=0;
long lefts=0;
for(int i=center;i>=left;i--){
lefts+=a[i];
if(lefts>s1)
s1=lefts;
}
long s2=0;
long rights=0;
for(int i=center+1;i<=right;i++){
rights+=a[i];
if(rights>s2)
s2=rights;
}
@@[sum=s1+s2](2);
if(sum sum=leftsum;
if(sum sum=rightsum;
}
return sum;
}

int main()
{
int n,i;
int a[N];
long sum=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
sum=@@[maxsubsum(a,1,n)](2);
cout< return 0;
}
```
### 输入格式:

第一行输入整数个数n(1≤n≤1000),再依次输入n个整数。

### 输出格式:

输出最大子段和。

### 输入样例1:

```in
5
-2 11 -4 13 -5 -2
```

### 输出样例1:

```out
20
```







答案:
第1空:a[left]>0?a[left]:0

第2空:maxsubsum(a,left,center)

第3空:maxsubsum(a,center+1,right)

第4空:sum=s1+s2

第5空:maxsubsum(a,1,n)

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。