01-1. 最大子列和問題(20)
阿新 • • 發佈:2019-02-02
給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11, -4, 13, -5, -2 },其連續子列{ 11, -4, 13 }有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。
輸入格式:
輸入第1行給出正整數 K (<= 100000);第2行給出K個整數,其間以空格分隔。
輸出格式:
在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。
輸入樣例:6 -2 11 -4 13 -5 -2
20
演算法一
演算法二#include <iostream> #define SIZE 100000 using namespace std; int main() { int i,j,k,N,A[SIZE]; int ThisSum=0,MaxSum=0; cin>>N; for(i=0;i<N;i++) { cin>>A[i]; } for(i=0;i<N;i++){/* i是子列左端位置*/ for(j=i;j<N;j++){/* j是子列右端位置*/ ThisSum=0;/* ThisSum是從A[i]到A[j]的子列和*/ for(k=i;k<=j;k++) ThisSum+=A[k]; if(ThisSum>MaxSum)/*如果剛得到的這個子列和更大*/ MaxSum=ThisSum;/*則更新結果*/ } } cout<<MaxSum<<endl; return 0; }
#include <iostream> #define SIZE 100000 using namespace std; int main() { int i,j,k,N,A[SIZE]; int ThisSum=0,MaxSum=0; cin>>N; for(i=0;i<N;i++) { cin>>A[i]; } for(i=0;i<N;i++) { ThisSum=0; for(j=i;j<N;j++) { ThisSum+=A[j];/*對於相同的i,不同的j,只要在j-1次迴圈的基礎上累加1項即可*/ if(ThisSum>MaxSum) MaxSum=ThisSum; } } cout<<MaxSum<<endl; return 0; }
演算法三線上處理
#include <iostream>
#define SIZE 100000
using namespace std;
int main()
{ int K,i,n;
int ThisSum=0,MaxSum=0,A[SIZE];
cin>>K;
for(i=0;i<K;i++)
{ cin>>A[i];
}
for(i=0;i<K;i++)
{ ThisSum+=A[i];/*向右累加*/
if(ThisSum>MaxSum)/*發現更大和則更新當前結果*/
MaxSum=ThisSum;
else if(ThisSum<0)/*如果當前子列和為負*/
ThisSum=0;/*則不可能使後面的部分和增大,拋棄之*/
}
cout<<MaxSum<<endl;
return 0;
}