hdu1231 最大连续子序列

src:http://acm.hdu.edu.cn/showproblem.php?pid=1231

思路:状态转移方程dp[i]=max(dp[i-1]+val[i],val[i]),连续子序列就是考虑要不要加上前面的~~子序列就要考虑前面所有的阶段~

ac代码:

#include<bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define inf 99999999
int n,val[10005];
int dp[10005];
int mm=0;
void init()
{
    mm=-1;
    memset(val,0,sizeof(val));
    memset(dp,0,sizeof(dp));
}
int main()
{
    std::ios::sync_with_stdio(false);
    int k=-1;
    while(cin>>n&&n!=0){
        init();
        FOR(i,1,n)cin>>val[i];
        for(int i=1;i<=n;i++){
            dp[i]=max(dp[i-1]+val[i],val[i]);
        }
        //FOR(i,1,n)cout<<dp[i]<<' ';cout<<endl;
        FOR(i,1,n){
            if(dp[i]>mm){
                mm=dp[i];k=i;
            }
        }
        //cout<<"mm:"<<mm<<endl;
        if(mm==-1){
            cout<<"0 "<<val[1]<<' '<<val[n]<<endl;
        }
        else {
            int beg=1;
            for(int j=k;j>=1;j--){if(dp[j]<0){beg=j+1;break;}}
            if(beg==-1)beg=1;
            cout<<mm<<' '<<val[beg]<<' '<<val[k]<<endl;
        }
    }

    return 0;
}

 

posted @ 2018-04-03 21:51  WindFreedom  阅读(185)  评论(0)    收藏  举报