hdu 1231 最大子段和

来源:互联网 发布:电视播放器软件 编辑:程序博客网 时间:2024/06/07 02:56
//经典DP//b[i] = max{b[i-1] + a[i],a[i]}//用n^2的暴力会超时。//注意保存子段首尾的位置#include <iostream>#include <cstring>#include <cstdio>using namespace std;int a[10001];int b[10001];int K;bool flag;int st,en;int main(){while(scanf("%d",&K) != EOF){if(K == 0)break;flag = true; int MAX = 0;int besti = 0;int bestj = 0;st = 0,en = 0; for(int i = 1; i <= K; i++){scanf("%d",&a[i]);if(a[i] >= 0)flag = false;}memset(b,0,sizeof(b));for(int i = 1; i <= K; i++){if(b[i-1] > 0){b[i] = b[i - 1] + a[i];en = i;}else{b[i] = a[i];  st = i;en = i;}if(b[i] > MAX){MAX = b[i];besti = st;bestj = en;}}if(flag)cout<<"0 "<<a[1]<<" "<<a[K]<<endl; elsecout<<MAX<<" "<<a[besti]<<" "<<a[bestj]<<endl;}return 0;}

原创粉丝点击