hdu1003最大子序列和

看了一些别人的题解,说实话,我现在还不会证明这个,我不知道为什么这样是最大值

//hdu1003最大连续子序列和
// sum[i] = sum[i-1]>0 ? sum[i-1]+a[i]:a[i];
//只有当sum处于增长状态时才会得到最大子序列
//当sum处于减小状态时,应当更新起点
 
#include <iostream>
using namespace std;

#define MAX 100003
#define INF 0x7fffffff;
int T;
long N;

int input,beg,end,sum,max_sum,pos;    
//定义输入值,最长序列启始和终至位置 ,序列当前和,序列最大和 

int main()
{
    cin>>T;
    for(int i = 1; i <= T; i++)
    {
            sum = 0;
            max_sum = -INF;
            beg = end = pos = 1;
            cin>>N;
            for(int j = 1; j <= N; j++)
            {
                    cin>>input;
                    if(sum < 0)
                    {
                           sum = input;
                           pos = j;
                    }
                    else
                    {
                        sum += input;
                    }
                    
                    if(sum > max_sum)     //更新序列信息 
                    {
                           max_sum = sum;
                           beg = pos;
                           end = j;
                    }
            }
            
            cout<<"Case "<<i<<":"<<endl;
            cout<<max_sum<<" "<<beg<<" "<<end<<endl;
            if(i != T)                      //PE若干次,千万要注意 
                 cout<<endl;
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值