給定k個整數組成的序列,「連續子列」被定義為,其中 1≤i≤j≤k。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。
輸入第1行給出正整數k (≤);第2行給出k個整數,其間以空格分隔。
在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。
6
-2 11 -4 13 -5 -2
20
我寫的**如下:
1 #include 234int 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.
有點囉嗦,但詳細。若有錯誤請指正。
#include2.這是稍難的,求最大子串行的同時請給出此最大子串行的頭和尾相對應的數值。
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...