HDU 1003 MAX SUM 贪心

原来就写过的经典贪心,本来今天想用尺蠖法再写的,后来发现好像写不出来。。。

其实也不太算贪心,就是从头扫到尾,找当前的子序列的大小关系:

初始化sum和ans都为负无穷,然后从头开始扫,伪代码如下:

sum < 0:
          if: sum < a[i]
		t_start = t_end = i
		sum = a[i]
			if: sum > ans
				ans = sum;
				start = t_start
				end = t_end


 
 

sum >= 0:
   sum += a[i]
	t_end = i
		if : sum > ans
			ans = sum
			start = t_start
			end = t_end


就这样,还有一点需要特别注意,数组要开大,我开小了re了好几次

平时用十六进制浪写小了一位

噢。。。对,这题也容易pe,注意回车啊

#include <iostream>
#include <cstdio>
#define maxn 0x3FFFF
using namespace std;
int a[maxn],n,T,t;

int main()
{
    #ifdef H_R
        freopen("in.txt","r",stdin);
    #endif // H_R
    ios::sync_with_stdio(false);
    cin.tie(false);
    while(cin>>T)
    {
        for(int f = 1 ; f <= T ; f++)
        {
           printf("Case %d:\n",f);
           cin>>n;
           a[0] = 0;
           for(int i = 1 ; i <= n ; i++)
               cin>>a[i];
           int s,e,ts,te,sum = -maxn,ans = -maxn;
           for(int i = 1 ; i <= n ; i++)
           {
               if(sum < 0)
               {
                   if(sum < a[i])
                   {
                       ts = te = i;
                       sum = a[i];
                       if(ans < sum)
                       {
                           ans = sum;
                           s = ts;
                           e = te;
                       }
                   }
               }
               else
               {
                   sum += a[i];
                   te = i;
                   if(sum > ans)
                   {
                       ans = sum;
                       s = ts;
                       e = te;
                   }
               }
           }
           printf("%d %d %d\n",ans,s,e);
           if(f != T)
            putchar('\n');
        }

    }
    return 0;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值