杭电1003 maxsum--解题报告

来源:互联网 发布:java线程死锁是什么 编辑:程序博客网 时间:2024/05/24 04:32

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1003


最常用的办法就是双重循环,但是绝对会超时,暴力方法在ACM上基本上都行不通。刚开始我也没有想到好的办法,后来参考网上的资料

写出下面的代码,他用的动态规划的思想,从后往前的分析:

首先我们先把整个数列都是负数的情况放到一边,另作讨论

ps:现在想不起来了,有空再补


先上代码:


#include<stdio.h>#define MinInt -272100120int  main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        int k,num,sum=0,max=MinInt,start=1,end=1,_s=1;        int MaxNum=MinInt,x=0;        bool flag=true;        scanf("%d",&k);        for(int j=0;j<k;j++)        {            scanf("%d",&num);            if(num>MaxNum)            {                MaxNum=num;                x=j+1;            }            sum+=num;            if(sum>0&&sum>max)            {                flag=false;                max=sum;                start=_s;                end=j+1;            }            if(sum<0)            {                sum=0;                _s=j+2;            }        }        if(flag)        {            max=MaxNum;            start=x;            end=x;        }        printf("Case %d:\n%d %d %d\n",i+1,max,start,end);        if((n-1)!=i)            printf("\n");    }}




原创粉丝点击