hdu 1003 MAX Sum

来源:互联网 发布:找黑客拿股民数据库 编辑:程序博客网 时间:2024/06/03 18:27

今天写了一道这道题的升级版 略有感悟 想把这两篇一起写了

http://blog.csdn.net/xishizuozuo/article/details/53869480

题解  这个题可以理解为枚举长度 只是把一些不必要的枚举省去了

例如 1 2 3  如果是枚举长度 可以有6种答案 

第一种1

第二种 2

第三种3

第四种1 2

第五种2 3

第六种1 2 3

这样太过于繁琐 所以可以压缩为


/*if(dp[b-1]>0)dp[b]=dp[b-1]+s1[b];            else dp[b]=s1[b];
*/

#include<stdio.h>#include<string.h>    int s1[100100];    int dp[100100];int main(){    int t,a,n,b,star,end,max;    scanf("%d",&t);    for(a=1;a<=t;a++)    {            if(a!=1)printf("\n");        scanf("%d",&n);        memset(dp,0,sizeof(dp));        for(b=0;b<n;b++)            scanf("%d",&s1[b]);            dp[0]=s1[0];        for(b=1;b<n;b++)//寻找前面的x个数相加最大        {            if(dp[b-1]>0)dp[b]=dp[b-1]+s1[b];//            else dp[b]=s1[b];//        }        max=dp[0];end=0;        for(b=1;b<n;b++)//下面这步就是简单地往回走求长度            if(dp[b]>max)            {                end=b;                max=dp[b];            }            star=end;            for(b=star-1;b>=0;b--)            {                if(dp[b]>=0)                    star=b;                else break;            }            printf("Case %d:\n",a);         printf("%d %d %d\n",max,star+1,end+1);    }    return 0;}


0 0
原创粉丝点击