解法1:maxsubsum1(a,n)演算法中用三重迴圈來窮舉所有的連續子串行,計算它們的和,時間複雜度為t(n) = o(n^3)。
1解法2:改進前面的解法,再求兩個相鄰子串行之和時,它們之間是關聯的,在前者計算出來後,求後者時只需在前者的基礎上加上一位數就是後者的連續子串行之和,不需要每次都重複計算,從而提高了演算法的效率。時間複雜度t(n) = o(n^2)。long maxsubsum1(int a,intn)2
14if(thissum > maxsum)maxsum =thissum;15}
16}17return maxsum;//
將maxsum的值返回給函式結果
18 }
1解法3:進一步改進解法2,如果掃瞄中遇到負數,當前子串行和thissum將會減小,若thissum為負數,表明前面掃瞄的子串行已經可以拋棄了,則放棄這個子串行,重新開始下乙個子串行的分析,並置thissum為0。若這個子串行和不斷增加,那麼最大子串行和也不斷增加。時間複雜度t(n) = o(n)。long maxsubsum2(int a,intn)2
13}14return
maxsum;
15 }
1昨天聽演算法設計課時聽到這些思想我感覺到了演算法的美好,所有的程式原始碼在下面,感興趣的小夥伴可以試試。int maxsubsum3(int a,intn)2
12return
maxsum;
13 }
1 #include 2程式源**long maxsubsum1(int a,int n)//
解法1 315
if(thissum > maxsum)maxsum =thissum;16}
17}18return maxsum;//
將maxsum的值返回給函式結果
19}
20long maxsubsum2(int a,int n)//
解法2
2132}33
return
maxsum;34}
35int maxsubsum3(int a,int n)//
解法3
3646
return
maxsum;47}
48/*
主函式*/
49int
main()
50,n = 6;52
int b = ,m = 12
;53 printf("
解法1:a序列的最大連續子串行和:%ld\n
",maxsubsum1(a,n));
54 printf("
解法1:b序列的最大連續子串行和:%ld\n
",maxsubsum1(b,m));
55 printf("
解法2:a序列的最大連續子串行和:%ld\n
",maxsubsum2(a,n));
56 printf("
解法2:b序列的最大連續子串行和:%ld\n
",maxsubsum2(b,m));
57 printf("
解法3:a序列的最大連續子串行和:%ld\n
",maxsubsum3(a,n));
58 printf("
解法3:b序列的最大連續子串行和:%ld\n
",maxsubsum3(b,m));
59 }
蠻力法求解最大連續子串行和問題
給定乙個有n n 1 個整數的序列,要求求出其中最大連續子串行的和。例如 序列 2,11,4,13,5,2 的最大子串行和為20 序列 6,2,4,7,5,3,2,1,6,9,10,2 的最大子串行和為16。規定乙個序列最大連續子串行和至少是0 看成0個元素構成的子串行 如果小於0,其結果為0。設含...
蠻力法 求解最大連續子串行和問題
題目 給定乙個有n n 1 個整數的序列,求解其中最大連續子串行的和。規定乙個序列的最大子串行和至少為0,若結果小於0,則其結果為0 例 序列 2,11,4,13,5,2 的最大子串行和為20 序列 6,2,4,7,5,3,2,1,6,9,10,2 的最大子串行和為16。思路一 窮舉法 設含有n個整...
最大連續子串行和 問題
為了證書,重新開始刷資料結構,原本也就是學的一知半解的,上來就給我來了乙個最大子串行和問題,搞得我很無奈,貌似hdu1003就是這個問題.第一 重新定義乙個新的sum陣列,然後進行儲存連續子串行的和,遇到前面的加和sum i 1 小於0,就直接讓sum i a i include include i...