思路:因为这道题求的是两个不相交子段的最大子段和,而且只能用O(n)的算法,别的都是会超时的,所以解题的主要思想是DP
先从左右运用DP求出最大的子段和,主要算法:
for(i=0; i<n; i++){
scanf("%d",&s[i]);
sum += s[i];
if(sum > temp){
temp = sum;
}
dp[i] = temp;
if(sum < 0){
sum = 0;
}
}
然后再由右至左的求出两个不相交子段的最大和
全部代码:
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int s[100001];
int dp[100001];
int i,j,n,temp,c,sum,ans;
while(cin>>n){
if(n == 0) return 0;
sum = 0;
temp = INT_MIN;
for(i=0; i<n; i++){
scanf("%d",&s[i]);
sum += s[i];
if(sum > temp){
temp = sum;
}
dp[i] = temp;
if(sum < 0){
sum = 0;
}
}
sum = 0;
ans = temp = INT_MIN;
for(i=n-1; i>0; i--){
sum += s[i];
if(sum > temp){
temp = sum;
}
if(dp[i-1] + temp > ans){
ans = dp[i-1] + temp;
}
if(sum < 0 ) sum = 0;
}
cout<<ans<<endl;
}
return 0;
}