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