PAT 1007. Maximum Subsequence Sum (25)

本文介绍了一种算法思路,用于找出一个整数序列中最大的连续非负数子序列及其和。通过记录序列中首个及末尾非负数的位置,并针对全为非负数或包含负数的不同情况进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:点击打开链接

思路:在输入的时候就记录第一个非负数和最后一个非负数的位置。把序列分为全为非负数和不全为非负数两种情况:

            1.全为非负数,根据题目要求输出sum为0,以及第一个和最后一个数字;

            2.不全为非负数,利用遍历选择。

注意:要考虑到数字为0的情况

代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int K;
	cin>>K;
	int j,i=0;
	vector<int> seq(K);
	int num[2]={0,0};
	int sum0,sum1,f1,f2;
	sum1=-1;      //作为最终最优值,设为-1是为了将总和为0的情况也能记录下来
	f1=f2=-1;     //记录第一个和最后一个非负数的位置
	//输入
	for(;i<K;++i)
	{
		cin>>seq[i];
		if(seq[i]>=0)
		{
			f2=i;         //最后非负数位置
			if(f1==-1)    //初始非负数位置
				f1=i;
		}
	}
	if(f1==-1)             //序列全为负数的情况
	{
		cout<<0<<" "<<seq[0]<<" "<<seq[K-1]<<endl;
	}
	else
	{
		for(i=f1;i<=f2;++i)
		{
			sum0=0;
			for(j=i;j<=f2;++j)
			{
				sum0+=seq[j];
				if(sum0>sum1)
				{
					sum1=sum0;
					num[0]=i;
					num[1]=j;
				}
			}
		}
		
		cout<<sum1<<" "<<seq[num[0]]<<" "<<seq[num[1]]<<endl;
	}
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值