HDU 1003 max sum

来源:互联网 发布:舒同 书法 知乎 编辑:程序博客网 时间:2024/06/02 02:24

最大连续子序列问题


dp做法

#include<bits/stdc++.h>using namespace std;int a[100020],dp[100020],l[100020],r[100020];int main(){    int T,N;    scanf("%d",&T);    for(int kase=1;kase<=T;kase++)    {        scanf("%d",&N);        for(int i=1;i<=N;i++)            scanf("%d",&a[i]);        dp[0]=0;        dp[0]=0,l[0]=1,r[0]=0;        for(int i=1;i<=N;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=INT_MIN;        int L,R;        for(int i=1;i<=N;i++)        {            if(dp[i]>ans)            {                ans=dp[i];                L=l[i];                R=r[i];            }        }        if(kase!=1)            printf("\n");        printf("Case %d:\n",kase);        printf("%d %d %d\n",ans,L,R);    }    return 0;}


非dp做法

#include<bits/stdc++.h>using namespace std;int main(){    int a[100020];    int K,T;    scanf("%d",&T);    for(int i=1;i<=T;i++)    {        scanf("%d",&K);        for(int j=1;j<=K;j++)            scanf("%d",&a[j]);        int s=0,l=1;        int L=1,R=1;        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;            }        }        printf("Case %d:\n",i);        printf("%d %d %d\n",M,L,R);        if(i!=T)            printf("\n");    }    return 0;}


0 0
原创粉丝点击