PAT - Maximum Subsequence Sum

Solution 1:

计算数组可以构成的所有子序列的和,然后求最大和,复杂度为O(N^3),最终结果运行超时。

#include<iostream>
#include <vector>
using namespace std;
int main()
{
	int num;
	cin>>num;
	vector<int> ivec; 
	int t; 
	while (cin>>t)
	{
		ivec.push_back(t);
	}
	int theMax=0, p, q;
	int negNum=0;
	for (int i=0;i<num;i++)
	{
		if(ivec[i]<0)
			negNum++;
		for (int j=i;j<num;j++)
		{
			int sum=0;
			for (int k=i;k<=j;k++)
			{
				sum+=ivec[k];
			}
			if(sum>theMax)
			{
				theMax=sum;
				p=ivec[i];
				q=ivec[j];
			}	
		}
	}
	if (negNum==num)
	{
		theMax=0;
		p=ivec[0];
		q=ivec[num-1];
	}
	cout<<theMax<<' '<<p<<' '<<q<<endl;
	system("pause");
	return 0;
}

Solution 2:

计算每个元素开头的子序列的最大和,并求最大和的最大值,复杂度为O(N^2),运行通过

#include<iostream>
#include <vector>
using namespace std;
int main()
{
	int num;
	cin>>num;
	vector<int> ivec; 
	int t; 
	while (cin>>t)
	{
		ivec.push_back(t);
	}
	int theMax=0, p, q;
	int negNum=0;
	for (int i=0;i<num;i++)
	{
		if(ivec[i]<0)
			negNum++;
		int sum=0;
		for (int j=i;j<num;j++)
		{
			sum+=ivec[j];
			if(sum>theMax)
			{
				theMax=sum;
				p=ivec[i];
				q=ivec[j];
			}	
		}
	}
	if (negNum==num)
	{
		theMax=0;
		p=ivec[0];
		q=ivec[num-1];
	}
	cout<<theMax<<' '<<p<<' '<<q<<endl;
	system("pause");
	return 0;
}

Solution 3:

利用递归,复杂度O(NlogN),不能给出子序列的开始数字和结尾数字。

#include<iostream>
#include <vector>
using namespace std;

int maxSubSum(const vector<int> & vec, int left, int right)
{
	if(left==right)
		if(vec[left]>0)
			return vec[left];
	int mid=(left+right)/2;
	int maxLeftSum=maxSubSum(vec,left,mid);
	int maxRightSum=maxSubSum(vec,mid+1,right);

	int maxLeft=0,leftSum=0;
	for (int i=mid;i>=left;i--)
	{
		leftSum+=vec[i];
		if(maxLeft<leftSum)
			maxLeft=leftSum;
	}

	int maxRight=0,rightSum=0;
	for(int i=mid;i<right;i++)
	{
		rightSum+=vec[i];
		if(maxRight<rightSum)
			maxRight=rightSum;
	}

	int maxMidSum=maxLeft+maxRight;
	int max=maxLeftSum>=maxMidSum?maxLeftSum:maxMidSum;
	max=max>=maxRight?max:maxRight;
	return max;
}

int main()
{
	int num;
	cin>>num;
	vector<int> ivec; 
	int t; 
	while (cin>>t)
	{
		ivec.push_back(t);
	}
	int theMax=0;
	int negNum=0;
	for (int i=0;i<num;i++)
	{
		if(ivec[i]<0)
			negNum++;
	}
	theMax=maxSubSum(ivec,0,num-1);
	if (negNum==num)
	{
		theMax=0;
	}
	cout<<theMax<<endl;
	system("pause");
	return 0;
}

Solution 4:

从一个数开始相加,保存最大和,如果加到某一个数后结果为负的,则从这一位之后开始相加,保存最大和,直到最后。复杂度O(N)。

#include<iostream>
#include <vector>
using namespace std;

int main()
{
	int num;
	cin>>num;
	vector<int> ivec; 
	int t; 
	while (cin>>t)
	{
		ivec.push_back(t);
	}
	int theMax=0,p,q;
	int negNum=0;
	int temp=0,x=0;
	for (int i=0;i<num;i++)
	{
		if(ivec[i]<0)
			negNum++;
		temp+=ivec[i];
		if (temp<=0)
		{
			temp=0;
			if (i+1<num)
				x=i+1;
		}
		if(theMax<temp)
		{
			theMax=temp;
			p=ivec[x];
			q=ivec[i];
		}
			
	}
	if (negNum==num)
	{
		theMax=0;
		p=ivec[0];
		q=ivec[num-1];
	}
	cout<<theMax<<' '<<p<<' '<<q<<endl;
	system("pause");
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值