hdu1231 最大字段和

这道题目曾经困扰我很久,觉得自己的程序应该没什么问题却老是WA,测试用例全部能通过,今天重新写了一遍 另外对全负数的情况进行了专门的处理 一次就AC了 开始有点困惑,现在一看前面的逻辑还真有点荒唐

 

AC代码:

#include<iostream>
using namespace
std;
int
num[10000];

int
spacial(int n)
{

    int
tag=1;
    for
(int i=0;i<n;i++)
        if
(num[i]>=0)
        {

            tag=0;
            break
;
        }

    return
tag;
}


void
find_max(int &low,int &high,int &max,int n)
{

    int
from,sum;
    from=sum=0;
    for
(int i=0;i<n;i++)
    {

        if
(num[i]+sum>max){max=sum+=num[i],low=from,high=i;}
        else if
(num[i]+sum>0){sum+=num[i];}
        else
{sum=0;from=i+1;}
    }
}



int
main()
{

    int
n;
    while
(cin>>n&&n)
    {

        for
(int i=0;i<n;i++)cin>>num[i];
        if
(spacial(n))cout<<0<<" "<<num[0]<<" "<<num[n-1]<<endl;
        else

        {

            int
low,high,max;
            low=high=0;max=-1;
            find_max(low,high,max,n);
            cout<<max<<" "<<num[low]<<" "<<num[high]<<endl;

        }
    }

    return
0;
}

经典dp题目,思路还是蛮自然的, 这种状态转换不需要特别的知识直观很容易想到,看看以前的错误版本还是没有很好地处理全负数的情况,此时返回的maxnum肯定是负数,也只有全负数的情况返回一个负数,直接分类处理输出就ok了

不过干脆 单独处理这种情况更清晰

下面贴出一个错误版本

#include <iostream>
using namespace std;
int
number[10000];
int
main()
{

   
    int
n,num;
    while
(cin>>n&&n)
    {

        int
sum=0,MaxSum=-100000000,start,end,from,to;
        for
(int i=1;i<=n;i++)
        {

            cin>>num;
            number[i]=num;
        }

        from=number[1];
        for
(int j=1;j<=n;j++)
        {

            sum+=number[j];
            to=number[j];
            if
(sum>MaxSum)
            {

                MaxSum=sum;
                start=from;
                end=to;
            }

            if
(sum<=0)
            {

                sum=0;
                if
(j<n)from=number[j+1];                       
            }

//             if (MaxSum<0)//元素全负
//             {
//             }
        }
        cout<<MaxSum<<" "<<start<<" "<<end<<endl;                            
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值