其他分享
首页 > 其他分享> > PAT A1007 Maximum Subsequence Sum

PAT A1007 Maximum Subsequence Sum

作者:互联网

题目难度:两颗半星
题目大意:给出一个序列中,连续的最大的和,并给出开始和结束的位置的元素。
题目坑点:刚开始的时候,输出了元素的位置,结果发现只有一个输出正确,我以为这个题目还有啥高深的地方,原来是弄错了,应该输出开始和结束的元素的值。
但是值得注意的是参考的代码给出的解法是记录开始和结束的位置,用数组记录,我自己的题解是在得出了最大的解之后,在往回减,减到零的位置就是开始的位置。其实肯定还是参考的代码的方法更好一点,时间复杂度可能会更低,但是往回找也就是O(n)的时间,因此不会因为这样就超时的。
题目还需要注意的是一个特殊的情况,如果所有的元素都是负数的话,那么需要输出序列开始和结束的元素,并且不要求输出最大的和,只需要输出零即可。
代码如下:

#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
int main(){
	int N;
	cin>>N;
	int num[N];
	int dp[N];
	for(int i=0;i<N;i++){
		cin>>num[i];
	}
	dp[0]=num[0];
	for(int i=1;i<N;i++){
		dp[i]=max(dp[i-1]+num[i],num[i]);
	}
	int s=-1,e=0,maxSum=dp[0];
	for(int i=1;i<N;i++){
		if(maxSum<dp[i]){
			maxSum=dp[i];
			e=i;
		}
	}
	for(int i=e;i>=0;i--){
		dp[e]-=num[i];
		if(dp[e]==0){
			s=i;
			break;
		}
	}
	if(maxSum<0){
		cout<<"0 "<<num[0]<<" "<<num[N-1];
	}
	else{
		cout<<maxSum<<" "<<num[s]<<" "<<num[e];
	}
}

标签:输出,PAT,int,Subsequence,num,A1007,题目,include,dp
来源: https://blog.csdn.net/weixin_42302528/article/details/104715355