問題描述:給定N個整數的序列{ A1, A2, …, AN}, 求該序列的最大子列和。
作業系統:Windows 10 編譯環境:Pycharm 程式設計語言:Python3.6
實現思路:首先得有資料,所以先用代碼實現隨機列表的產生,隨後用三種演算法實現,並在主函數中實現函數的調用以及結果的輸出
import random#產生隨機列表 start和stop分別代表所需要列表元素的大小範圍,length代表列表的長度def random_int_list(start, stop, length): start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start)) length = int(abs(length)) if length else 0 random_list = [] for i in range(length): random_list.append(random.randint(start, stop)) return random_listdef main(): N = 10 A = random_int_list(-20, 20, N) maxsum = MAXSUBSEQSUM1(A, N) maxsum2= MAXSUBSEQSUM2(A, N) maxsum3= MAXSUBSEQSUM3(A, N) #分別用三種演算法實現並輸出結果 print(maxsum) print(maxsum2) print(maxsum3)#用最基礎的方法來實現最大子列和,演算法複雜度O(N*N*N)def MAXSUBSEQSUM1(A, N): ThisSum, MaxSum = 0, 0 for i in range(N): #i代表子列的左端位置 for j in range(i, N):#j代表子列的左端位置 ThisSum = 0 #ThisSum是從A[I]到A[J]的子列和 for k in range(i, j+1): ThisSum += A[k] if ThisSum > MaxSum: #如果剛得到的這個子列和更大 MaxSum = ThisSum #則更新結果 return MaxSum#在上面那個演算法做了一些修改使演算法複雜度降低,演算法複雜度O(N*N)def MAXSUBSEQSUM2(A, N): ThisSum, MaxSum = 0, 0 for i in range(N): ThisSum = 0 for j in range(i, N): ThisSum += A[j] #只在前一個和上增加一個元素得到新的和 if ThisSum > MaxSum: MaxSum = ThisSum return MaxSum#線上處理演算法def MAXSUBSEQSUM3(A, N): ThisSum, MaxSum = 0, 0 for i in range(N): ThisSum += A[i] #向右累加 if ThisSum > MaxSum: MaxSum = ThisSum #發現更大和則更新當前結果 elif ThisSum<0: #如果當前子列和為負數 ThisSum=0 #則不可能使後面的部分和增大,則該拋棄掉 return MaxSummain()