HDU 1231 最大连续子序列

来源:互联网 发布:画数据流程图的软件 编辑:程序博客网 时间:2024/06/04 20:02

dp解法

#include<bits/stdc++.h>using namespace std;int a[10020],dp[10020],l[10020],r[10020];int main(){    int K;    while(scanf("%d",&K)==1&&K)    {        for(int i=1;i<=K;i++)            scanf("%d",&a[i]);        dp[0]=0,l[0]=1,r[0]=0;        for(int i=1;i<=K;i++)        {            if(dp[i-1]+a[i]>=a[i])            {                dp[i]=dp[i-1]+a[i];                r[i]=r[i-1]+1;                l[i]=l[i-1];            }            else            {                dp[i]=a[i];                l[i]=i;                r[i]=i;            }        }        int ans=-1;        int L,R;        for(int i=1;i<=K;i++)        {            if(dp[i]>ans)            {                ans=dp[i];                L=l[i];                R=r[i];            }        }        if(ans==-1)            printf("0 %d %d\n",a[1],a[K]);        else            printf("%d %d %d\n",ans,a[L],a[R]);    }    return 0;}

非dp解法

#include<bits/stdc++.h>using namespace std;int a[10020];int main(){    int K;    while(scanf("%d",&K)==1&&K)    {        int s=0,l=1;        int L=1,R=1;        for(int j=1;j<=K;j++)            scanf("%d",&a[j]);        int M=a[1];        for(int j=1;j<=K;j++)        {            s+=a[j];            if(s>M)            {                L=l;                M=s;                R=j;            }            if(s<0)            {                s=0;                l=j+1;            }        }        if(M<0)        {            M=0;            L=1;            R=K;        }        printf("%d %d %d\n",M,a[L],a[R]);    }    return 0;}


0 0
原创粉丝点击