最大子段和问题~2021.1.11

题目描述

最大子段和问题。给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。

输入格式

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

输出格式

输出最大子段和。

输入样例

5
-2 11 -4 13 -5 -2

输出样例

20

AC代码

#include <iostream>
using namespace std;
typedef long long ll;
const ll maxn = 10500;
ll a[maxn] = {
    
    0},b[maxn] = {
    
    0};
ll ans = -1000005;
int main()
{
    
    
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
    
    
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
    
    
		if(i == 1){
    
    
			b[i] = a[i];
		}
		else{
    
    
			b[i] = max(b[i-1]+a[i],a[i]);
		}
		ans = max(ans,b[i]);
	}
	cout<<ans;
	return 0;
}

解释

〇最大子段和问题在之前我所发的博文中两次提及,但今天又遇到了这个问题,由于是参考了之前的博文才解出本题,故再发一篇博文当作巩固。
a[maxn] = {0},b[maxn] = {0};a数组用来存储输入的元素,b数组用来记录局部最大子段和
核心

for(int i=1;i<=n;i++){
    
    
	if(i == 1){
    
    //如果是第一个元素,那么它本身就是局部最大子段和
		b[i] = a[i];
	}
	else{
    
    //否则,如果前面的子段和加上当前元素对局部最大子段和没有贡献,那么最大子段和
		 //为当前元素本身。(举个例子,之前的子段和为负数,显然加上它对最大子段和无贡献)
		b[i] = max(b[i-1]+a[i],a[i]);
	}
	ans = max(ans,b[i]);//记录最大子段和
}

③完美的AC。

猜你喜欢

转载自blog.csdn.net/fatfairyyy/article/details/112481341
今日推荐