1007 Maximum Subsequence Sum

1007 Maximum Subsequence Sum

题目大意

统计最大子序列的和,输出首尾元素

算法思想

  • 注意题目特殊要求,是要输出首尾元素
  • 如果全为负,需要输出0,以及整个序列的首尾元素
  • 仅当大于时才会改变,满足相等时,输出的是较小的i和j

代码

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int k;
	int i, j;
	cin >> k;
	vector<int>s;
	bool ne = false;
	for (i = 0; i < k; i++)//输入
	{
		int q;
		cin >> q;
		s.push_back(q);
		if (q >= 0)//判断是否全负
		{
			ne = true;
		}
	}
	int max=s[0];//初始化
	int sum = 0;
	int op=s[0], ed=s[s.size()-1];
	if (ne == true)//不为全负
	{
		for (i = 0; i < k; i++)
		{
			if (s[i] < 0)//如果当前i的值为负,可以跳过
				continue;
			sum = 0;
			for (j = i; j < k; j++)
			{
				sum += s[j];//统计从i到j的和
				if (sum < 0)//当前和为负,跳过该i
					break;
				if (sum > max)//仅当sum大于max时,才会改变
				{
					max = sum;
					op = s[i];
					ed = s[j];
				}
			}
		}
	}
	else//全负
	{
		max = 0;
	}
	cout << max << " " << op << " " << ed;
}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值