轉載自http://www.2cto.com/database/201412/365548.html
問題描述:
輸入一組整數,求出這組數字子序列和中最大值。也就是隻要求出最大子序列的和,不必求出最大的那個序列。例如:
序列:-2 11 -4 13 -5 -2,則最大子序列和爲20。
序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,則最大子序列和爲16。
下面依次給出幾個不同實現算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
int
MaxSubseqSum1( int
A[], int
N )//算法1 T( N ) = O( N3 ) { int
ThisSum, MaxSum = 0; int
i, j, k; 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; /*
則更新結果*/ }
/*
j循環結束*/ }
/*
i循環結束*/ return
MaxSum; } int
MaxSubseqSum2( int
A[], int
N ) //算法2T( N ) = O( N2 ) { int
ThisSum, MaxSum = 0; int
i, j; for (
i = 0; i < N; i++ ) /*
i是子列左端位置*/ { ThisSum
= 0; /*
ThisSum是從A[i]到A[j]的子列和*/ for (
j = i; j < N; j++ ) /*
j是子列右端位置*/ { ThisSum
+= A[j]; /*對於相同的i,不同的j,只要在j-1次循環的基礎上累加1項即可*/ if(
ThisSum > MaxSum ) /*
如果剛得到的這個子列和更大*/ MaxSum
= ThisSum; /*
則更新結果*/ }
/*
j循環結束*/ }
/*
i循環結束*/ return
MaxSum; } int
MaxSubseqSum4( int
A[], int
N ) //算法4T( N ) = O( N2 ) { int
ThisSum, MaxSum; int
i; ThisSum
= MaxSum = 0; for (
i = 0; i < N; i++ ) { ThisSum
+= A[i]; /*
向右累加*/ if(
ThisSum > MaxSum ) MaxSum
= ThisSum; /*
發現更大和則更新當前結果*/ else
if( ThisSum < 0 ) /*
如果當前子列和爲負*/ ThisSum
= 0; /*
則不可能使後面的部分和增大,拋棄之*/ } return
MaxSum; }//“在線”的意思是指每輸入一個數據就進行即時處理,在任
何一個地方中止輸入,算法都能正確給出當前的解。 |
算法3---分治法