首页 > 代码库 > HDU 1003 Max Sum

HDU 1003 Max Sum

这题一看就想到用dp来做,至于为什么我也不知道。其dp的思想也比较简单,不过自己写的有点复杂了,看了网上的题解才知道自己是那么的弱。

这个是我的代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
int dp[N],s[N],e[N],data[N];
int main()
{
    int t,n,k=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&data[i]);
            dp[i]=data[i];
            s[i]=i,e[i]=i;
        }
        int ans=dp[1],_s=1,_e=1;
        for(int i=2;i<=n;i++)
        {
            int t=dp[i-1];
            for(int j=e[i-1]+1;j<=i;j++)
                t+=data[j];
            if(t>=dp[i-1]&&t>=dp[i])
            {
                dp[i]=t;
                s[i]=s[i-1];
                e[i]=i;
            }
            if(t<=dp[i-1]&&dp[i]<=t)
            {
                dp[i]=dp[i-1];
                s[i]=s[i-1];
                e[i]=e[i-1];
            }
            if(ans<dp[i])
            {
                ans=dp[i];
                _s=s[i];
                _e=e[i];
                //printf("_s=%d,_e=%d\n",_s,_e);
            }
        }
        if(k>1)
            printf("\n");
        printf("Case %d:\n",k++);
        printf("%d %d %d\n",ans,_s,_e);
    }
    return 0;
}

网上别人的代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
int data[N];
int main()
{
    int t,n,k=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&data[i]);
        int ans=data[0],_max=data[0],_s=0,_e=0,posi=0;
        for(int i=1;i<n;i++)
        {
            if(_max+data[i]<data[i])
            {
                _max=data[i];
                posi=i;
            }
            else
                _max+=data[i];
            if(ans<_max)
            {
                ans=_max;
                _s=posi;
                _e=i;
            }
        }
        printf("Case %d:\n",k++);
        printf("%d %d %d\n",ans,_s+1,_e+1);
        if(t)
            printf("\n");
    }
    return 0;
}


HDU 1003 Max Sum