/*
busyfisher 2013/6/25
poj 2593 max sequence
动态规划:分别求出从左到右顺序数组的最大子数组和从右到左顺序数组的最大子数组;
ans = max{dp_left[i]+dp_left[i+1] | 1<=i<N}
Memory: 1432K Time: 204MS
Language: C++ Result: Accepted
*/
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
#define maxn 100000+100
int data[maxn];
int main()
{
int numbers;
while(cin>>numbers && numbers){
for(int i=1;i<=numbers;i++)
scanf("%d",&data[i]);
int dp_left[maxn],dp_right[maxn];
dp_left[1] = data[1] ,dp_right[numbers] = data[numbers];
for(int j=2;j<=numbers;j++){
if(dp_left[j-1]>0)
dp_left[j] = dp_left[j-1]+data[j];
else
dp_left[j] = data[j];
}
for(int j=2;j<=numbers;j++)
if(dp_left[j]<dp_left[j-1])
dp_left[j] = dp_left[j-1];
for(int j=numbers-1;j>=1;j--){
if(dp_right[j+1]>0)
dp_right[j] = dp_right[j+1]+data[j];
else
dp_right[j] = data[j];
}
for(int j=numbers;j>1;j--)
if(dp_right[j]>dp_right[j-1])
dp_right[j-1] = dp_right[j];
int max = -(1<<20);
for(int j=1;j<numbers;j++)
max = (dp_left[j] + dp_right[j+1] > max ? dp_left[j] + dp_right[j+1] : max);
cout<<max<<endl;
}
return 0;
}
poj 2593 max sequence
最新推荐文章于 2022-07-04 17:23:13 发布