循环数组最大子段和 51Nod - 1050

循环数组最大子段和

题目链接:51Nod - 1050
题意:就是题目, 循环数组最大子段和;
如果不加循环二字吗妥妥的DP做出来了, 异常的简单;加上循环二字就难办了;以每个数为起点跑一遍最大子段和???
O(n^2)的复杂度, 算了, 这样死死的过不了;
换个角度想, 可不可以求个最小子段和?嗯, 这个很好求, 和最大一样;有用吗?, 有用!
数组和减去最小子段和不就是循环的时候的最大子段和吗?没错就是这样的;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=100100;
long long a[maxn], n, minn, maxx, sum, x, y;
int main(){
	while(~scanf("%lld", &n)){
		for(int i=0; i<n; i++){
			scanf("%lld", &a[i]);
		}
		sum=x=y=0LL;
		for(int i=0; i<n; i++){
			if(i==0){
				maxx=max(0LL, a[i]);
				minn=min(0LL, a[i]);
			}
			else{
				maxx=max(maxx+a[i], 0LL);
				minn=min(a[i]+minn, 0LL);
			}
			y=max(y, maxx);
			x=min(x, minn);
			sum+=a[i];
		}
		long long ans=max(y, sum-x);
		printf("%lld\n", ans);
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/sirius_han/article/details/80391781
今日推荐