又谈最大连续子序列 hoj-1003

上面谈到用DP做最大连续子序列,后来又看到另一种方法:

网上说是一个专家提出,确实挺简单的,具体证明就不给出了,大家有兴趣的可以网上找找。

如果实在不理解就先敲几遍记住吧。。。。。

题意:也是给出一列数,求其中最大的连续序列和,和首尾排位数;

输入:第一行是测试例子数,然后跟N行例子。输出:两行,第一行是Case %d:    第二行依次是  最大和,首尾排位数,末尾排位数。

例子:

2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5

Case 1:
14 1 4

Case 2:
7 1 6

现给出AC代码:

#include<stdio.h>
int main()
{
    int T,t,n,time,sum,maxs,i,a;
    int st,ed;
    scanf("%d",&t);
    T=t;
    while(t--)
    {
        time=1;sum=0;maxs=-1001;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a);
            sum+=a;
            if(sum>maxs)
            {
                maxs=sum;
                st=time;
                ed=i;
            }
            if(sum<0)
            {
                sum=0;
                time=i+1;
            }
        }
        printf("Case %d:\n%d %d %d\n",T-t,maxs,st,ed);
        if(t)printf("\n");
    }
    return 0;
}

 用DP过的代码:

#include<stdio.h>
int main()
{
    int a[100010],sum[100010],maxn;
    int N,n,m,i,st,ed;
    scanf("%d",&n);
    N=n;
    while(n--)
    {
        scanf("%d",&m);
        for(i=1;i<=m;i++)
            scanf("%d",&a[i]);
        sum[0]=0;
        for(i=1;i<=m;i++)
        {
            if(sum[i-1]>=0)
                sum[i]=sum[i-1]+a[i];//状态转移方程;
            else
                sum[i]=a[i];
        }
        maxn=-1001;
        for(i=1;i<=m;i++)
            if(sum[i]>maxn)
            maxn=sum[i],ed=i;

        st=ed;
        for(i=ed-1;i>=1;i--)
            if(sum[i]>=0)
                st=i;
            else break;
        printf("Case %d:\n%d %d %d\n",N-n,maxn,st,ed);
        if(n)printf("\n");
    }
    return 0;
}

 

posted @ 2013-07-11 15:59  拼搏今朝 努力奋进  阅读(265)  评论(0)    收藏  举报