题解 简单限行dp 杭电OJ 1003

题意:给T组数据,求每组数据序列和最大的序列,输出最大值和起止位置。

做法:建立一个数组a[n]记录数据,f[n]记录到该点时的最大和;

  递推可得,如果f[n-1]>=0,f[n]=f[n-1]+a[n];反之,f[n]=a[n];

代码:

#include <iostream>
#include <cstring>
using namespace std;
int i,j,tot[100000],a[100000];
int main()
{
    int T,number=1;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        int f[n],b[n];
        memset(a,0,sizeof(a));
        memset(f,0,sizeof(f));
        memset(tot,0,sizeof(tot));
        for(i=0;i<n;i++)
            cin>>a[i];
            f[0]=a[0],b[0]=0;
        for(i=1;i<n;i++)
        {
            if(f[i-1]>=0)f[i]=f[i-1]+a[i],b[i]=b[i-1];
            else f[i]=a[i],b[i]=i;
        }
        int ans=0,pos=0,start=0;
        for(i=0;i<n;i++)
            if(ans<f[i])ans=f[i],pos=i,start=b[i];
        int j;
        for(i=0;i<n;i++)
        {

            if(a[i]>0)
                break;
            else if(i==n-1)
                {
                    ans=f[0];
                    for(j=0;j<n;j++)
                    f[j]=a[j];
                    for(j=0;j<n;j++)
                    if(ans<f[j])ans=f[j],pos=j,start=j;

                }
        }
        cout<<"Case "<<number++<<":"<<endl;
        cout<<ans<<" "<<start+1<<" "<<pos+1<<endl;
        if(T!=0)
            cout<<endl;
    }
    return 0;
}

错误原因:WA 对于全负数的情况没有加以考虑。

posted on 2014-07-16 17:58  一锅土豆  阅读(157)  评论(0编辑  收藏  举报