超级简单的DP 不过那个判断要注意下。。。我开始用sum = -sum(abs(a[i]))来判断一直错。。。。。。
ac代码如下:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main(){
int K, a[10010], first, pos, end, startfrom, dp[10010], flog;
while( scanf( "%d", &K ) && K ){
memset( a, 0, sizeof( a ) );
memset( dp, 0, sizeof( dp ) );
flog = 1;
for( int i = 0; i < K; i++ ){
scanf( "%d", a + i );
if( a[i] >= 0 ){
flog = 0;
}
}
if( flog ){
cout << 0 << " " << a[0] << " " << a[K-1] << endl;
continue;
}
startfrom = a[0];
first = end = pos = 0;
dp[0] = a[0];
for( int i = 1; i < K; i++ ){
if( startfrom + a[i] < a[i] ){
startfrom = a[i];
pos = i;
}else{
startfrom += a[i];
}
if( dp[i-1] < startfrom ){
first = pos;
end = i;
dp[i] = startfrom;
}else{
dp[i] = dp[i-1];
}
}
cout << dp[K-1] << " " << a[first] << " " << a[end] << endl;
}
return 0;
}