最大子串行求和問題

2022-09-07 19:18:12 字數 1611 閱讀 8166

給定k個整數組成的序列,「連續子列」被定義為,其中 1≤i≤j≤k。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。

輸入第1行給出正整數k (≤);第2行給出k個整數,其間以空格分隔。

在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。

6

-2 11 -4 13 -5 -2

20

我寫的**如下:

1 #include 234

int maxsubseqsum(int a,int

n);5

intmain ()

615 sum=maxsubseqsum(a,n);

16 printf("

%d\n

",sum);

17return0;

18}19int maxsubseqsum(int a,int

n)//求最大子串行長度函式

2037

return

maxsum;

38 }

這個程式的時間複雜度是比較好的,大概是o(n)吧。當然,這道題還可以用暴力三個迴圈給暴力出來,但時間複雜度太高,o(n^3),不推薦。

好,現在解釋一下吧。

用樣例講吧,

6

-2 11 -4 13 -5 -2

6個數存進陣列a中,然後進入函式maxsubseqsum()中,傳進陣列長度n,和陣列元素a。

在函式體中,首先定義乙個當前總和thissum和子串行總和maxsum。

初始化它們為0,然後乙個迴圈搞定。

在迴圈中,我們首先將序列的第乙個數給thissum,本例中就是將-2給thissum,判斷此時的thissum是否大於maxsum,顯然,-2maxsum=0,將maxsum置為11。且此時的thissum=11>0,我們不將它置為0,它還是11.

以此列推,此時,thissum=11+(-4)=7,時,比maxsum小,就不把它給maxsum了。但是它大於0,thissum還是7.

接下來,thissum=7+13=20時,thissum=20>maxsum=11,我們就可以將maxsum置為20了。顯然此時thissum=20大於0,它暫時不置為0

遇到-5,thissum=15,它還不能撼動maxsum的20,遇到-2時,thissum=13,還是無法撼動maxsum的20,

所以,最終maxsum=20,函式返回了maxsum=20.

有點囉嗦,但詳細。若有錯誤請指正。

2.這是稍難的,求最大子串行的同時請給出此最大子串行的頭和尾相對應的數值。

#include

using namespace std;

void maxsubseqsum(int a,int n);

int main ()

void maxsubseqsum(int a,int n)

maxsum=thissum;

outs=i;

}else if(thissum<0)

}if (flag_max==0)

else

}

最大子串行求和問題

給定整數a1 role presentation a1a 1,a2 role presentation a2a 2,an role presentation ana n 可能有負數 求 k ija k role presentation jk iak k i jak的最大值 為方便起見,如果所有整數...

最大子串行求和 絕妙的演算法 最大子串行和問題

問題的引入 給定 可能有負數 整數序列a1,a2,a3.an,求這個序列中子序列和的最大值。為方便起見,如果所有整數均為負數,則最大子串行和為0 例如 輸入整數序列 2,11,8,4,1,16,5,0,則輸出答案為35,即從a2 a6。這個問題之所以有吸引力,主要是因為存在求解它的很多演算法,而這些...

最大子串行求和整理筆記

在最大子串行的問題中,這裡有四種解法,時間複雜度由高到低,可以直觀的感受到解決問題的演算法技巧。c語言 如下 include define maxn 100 int a maxn 輸入 void input int a,int n 輸出 void output int a,int n o n n n...