题目连接
1.题目分析
题目求最大连续子序列和
有3种方法
(1)暴力求解,3重循环,不推荐,超时
for(int i=0;i<N;i++){
for(int j=i;j<N;j++){
for(int k=i;k<j;k++){
tempsum += num[k];
if(tempsum>sum){
sum = tempsum;
start = i;
end = j;
}
}
}
}
(2)分析之后,可以看出,a[i,j]=a[i,j-1]+num[j],其中a[i,j-1]在之前已经求出了,所以将3重循环降至2重循环
for(int i=0;i<N;i++){
thissum =0;
for(int j=i;j<N;j++){
thissum += num[j];
if(thissum>maxsum){
maxsum = thissum;
start = i;
end =j;
}
}
}
(3)线性求
for(int i=0;i<N;i++){
thissum += num[i];
if(thissum<0){
tstart = i;
thissum=0;
}
if(thissum>maxsum){
maxsum=thissum;
start = tstart;
end =i;
}
}
2.题目代码
(1)2重循环
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){
int N;
cin>>N;
int num[N];
for(int i=0;i<N;i++){
cin>>num[i];
}
int sum =-1,tmp=0,start=0,end=N-1;
for(int i=0;i<N;i++){
tmp =0;
for(int j=i;j<N;j++){
tmp+=num[j];
if(tmp>sum){
sum=tmp;
start = i;
end=j;
}
}
}
if(sum<0){
sum=0;
}
cout<<sum<<" "<<num[start]<<" "<<num[end];
return 0;
}
(2)1重循环
#include <iostream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char *argv[]) {
int N;
cin>>N;
int num[N];
for(int i=0;i<N;i++){
cin>>num[i];
}
int tempsum=0,sum=-1,templeft=0,tempright=N-1,tempindex=0;
for(int i=0;i<N;i++){
tempsum+=num[i];
if(tempsum<0){
tempindex=i+1;
tempsum=0;
}
else if(tempsum>sum){
sum = tempsum;
templeft = tempindex;
tempright= i;
}
}
if(sum<0){
sum = 0;
}
cout<<sum<<" "<<num[templeft]<<" "<<num[tempright]<<endl;
return 0;
}