最长连续子序列和,区间DP
ti
#include<bits/stdc++.h>
using namespace std;
int n, a[10010];
int res1, res2, ans;
int dp[10010];
int main()
{
while(cin>>n && n){
memset(dp, 0, sizeof dp);
bool f = 1;
for(int i = 0; i < n; i ++ ){
cin>>a[i];
if(a[i] >= 0) f = 0;
}
if(f){
cout<<0<<' '<<a[0]<<' '<<a[n - 1]<<endl;
continue;
}
ans = a[0];
dp[0] = a[0];
int st = 0, en = 0, res1 = 0, res2 = 0;
//dp[i]表示前i个里最大的
for(int i = 1; i < n; i ++ ){
if(a[i] > dp[i - 1] + a[i]){ //新起一段序列
dp[i] = a[i];
st = i;
}
else{ //延续之前的序列
dp[i] = dp[i - 1] + a[i];
}
if(dp[i] > ans){
res1 = st;
res2 = i;
ans = dp[i];
}
}
cout<<ans<<' '<<a[res1]<<' '<<a[res2]<<endl;
}
return 0;
}