1. 程式人生 > >演算法設計與分析——最大連續子序列之和問題

演算法設計與分析——最大連續子序列之和問題

最大連續子序列之和問題是用來分析時間複雜度的很好的例子,這裡簡要分析和記述下整個過程。

{3,4,-2,1,-5,-2,5}

{-2,7,4,11,-2,-8,12,1}

{-2,7,4,11,-2,-8,12,1,-3}

{3,-2,7,4,11,-2,-8,12,1,-3}

{-2,1,-2,3,-2,7,4,11,-2,-8,12,1,-3}

{-2,1,-2,3,-2,7,4,-11,-2,-8,-13,1,-3}

{-2,-1,-2,-3,-2,-7,-4,-11,-2,-8,-13,-1,-3}

假設有以上這些測試資料,可以很輕易的用肉眼找出它們的最大連續子序列,下面我們來設計演算法,實現計算機的識別和計算過程。

首先你能想到的方法是什麼呢?

對!計算每種可能,也即總數為n的資料集合共有n!種可能。

max = array[0]

迴圈1:sum=array[next]

    迴圈2:if sum>max 則 max = sum 且 sum+=array[next]

迴圈1每次迴圈都會去掉一個位於母序列前方的一個元素,直到遍歷到最後一個結束;迴圈2則負責將後面的元素累加求和。

int max =  Array[0];
	for(int i=0;i < length;i++){
		int sum = Array[i];
		for(int j=i+1;j < length;j++){
			if(sum > max)
				max = sum;
			sum += Array[j];
					
		}
	}

最後結果:

    7、25、25、26、26、12、-1

雙重迴圈時間複雜度一眼得見O(length^2).

其實,由以上的計算可知,並不一定要每次都加,如果當前的sum<0就可以將其捨棄,畢竟加上負數只會減小max,而且之前的max已經儲存。

因此,我們利用sum來求前i個元素的和,即

先使max = array[0]

迴圈:sum+=array[i]

if sum>max 則max = sum 

if sum<0 則sum = 0

int max =  Array[0];
	int sum = 0;
	
	for(int i=0;i < length;i++){
		sum += Array[i];
		if(sum > max)
			max = sum;
		if(sum < 0)
			sum = 0;
	}

最後結果:

    7、25、25、26、26、12、-1

單層迴圈時間複雜度O(length)

完整程式碼見https://github.com/TofuGan7/Algorithm-design-and-analysis/blob/master/main.cpp

相關推薦

演算法設計分析——連續序列之和問題

最大連續子序列之和問題是用來分析時間複雜度的很好的例子,這裡簡要分析和記述下整個過程。{3,4,-2,1,-5,-2,5}{-2,7,4,11,-2,-8,12,1}{-2,7,4,11,-2,-8,12,1,-3}{3,-2,7,4,11,-2,-8,12,1,-3}{-2

學習筆記——c語言實現連續序列之和演算法

今天到圖書館借了本資料結構的書,翻開一看,原來這裡有我之前參加的周立功機試的題目,哎,真是後悔莫及啊!現在把這個問題好好總結一下,以備不時之需。 最大連續子序列之和問題:給出N個整數(可以為負)A1,A2,A3,…,An,找出i到j項之和的最大值,如果所有整數為負,最大值為

連續序列之和問題(O(n*n)

#include<iostream> #include<stdlib.h> using namespace std; int MaxSubsequenceSum(int a[]

連續序列之和(動態規劃)

1. 問題描述 設n個元素的序列儲存在陣列A[0..n-1]中,求陣列中連續子序列之和的最大值。 2. 遞推公式 設All[i]為子問題A[i..n-1]的連續子序列之和的最大值,start[i]為從A[i]開始的連續序列之和的最大值,因此: All[i] = A[n-

演算法分析-連續陣列(分治策略)

大家好,我是三十三,第一次寫部落格,有什麼考慮不周的,請廣大同學多多指正。作為一個計算機專業毛都不會的即將畢業狗,說實話,心裡一點有一絲絲慌慌的。在即將畢業之際,自己還是想囤點貨給自己貼貼金,有啥錯誤還望指出。一、 實驗目的及任務分治法求解最大子陣列問題二、 實驗環境c++或

【資料結構演算法】小於等於k的連續序列

使用Kadane演算法可以在On內得到最大連續子序列和。如果要求得到和不超過k,那麼該如何解決? 首先要看能不能繼續使用Kadane演算法。答案是不能。回顧Kadane,Kadane中使用dp[i]存最後一個元素是array[i]的最大和,然後所有dp[i]的最大值。 那麼

連續序列 HDU - 1231

bsp 最大 程序 結構 %d col 最小 元素 class 給定K個整數的序列{ N1, N2, ..., NK },其任意連續子序列可表示為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大連續子序列是所有連續子

阿裏筆試題:求兩個子序列連續序列

代碼 else nat 順序 post string popu substr 連續 原題例如以下: 給定一個query和一個text。均由小寫字母組成。要求在text中找出以相同的順序連續出如今query中的最長連續字母序列的長度。比如。query為 "acbac",t

HDU 1231 連續序列:水dp

一段 size pid 答案 定義 題意 如果 最大連續子序列 esp 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 題意:   給你一個整數序列,求連續子序列元素之和最大,並輸出該序列的首尾元素(若不唯一,輸出首坐

(4)C語言——求連續序列

log spa clas 最大連續子序列和 alloc 最大 code max 連續 題目: 輸入一組整數,求出這組數字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那個序列。例如: 序列:-2 11 -4 13 -5 -2,則最大子序列和為20。 序列:-

連續序列

運行時 介紹 最大連續子序列和 () vector 運行 n) else 連續子序列和 下面介紹一個線性的算法,這個算法是許多聰明算法的典型:運行時間是明顯的,但是正確性則很不明顯(不容易理解)。 //線性的算法O(N) long maxSubSum4(const vec

HDU-1231 連續序列

ios -1 數組 結束 sample 狀態轉移方程 要求 mes 最大連續 題目 Problem Description 給定K個整數的序列{ N1, N2, ..., NK },其任意連續子序列可表示為{ Ni, Ni+1, ..., Nj },其中 1 <

L - 連續序列<HDU 1231>

第一個 測試用例 最大連續子序列 連續子序列 的區別 int con -a font L - 最大連續子序列 給定K個整數的序列{ N1, N2, ..., NK },其任意連續子序列可表示為{ Ni, Ni+1, ..., Nj },其中 1 <= i <=

杭電acm 1231 連續序列

                          

連續序列和/長不下降序列/長公共序列/長迴文

//最大連續子序列和 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 10010; int A[maxn],dp[maxn]; int main(){ int

動態規劃——連續序列

最大連續子序列和問題如下:       下面介紹動態規劃的做法,複雜度為 O(n)。   步驟 1:令狀態 dp[i] 表示以 A[i] 作為末尾的連續序列的最大和(這裡是說 A[i] 必須作為連續序列的末尾)。   步驟

hdoj1003+codeup2086:Max Sum連續序列和問題解法總結

目錄 hdoj 1003求解方法 暴力求解O(n^3)/O(n^2)(不推薦,很可能會超時) 分治法(比較複雜,掌握思想即可) 遍歷求和法O(n) dp動態規劃(強推) codeup2086的求解方法 dp求解 hdoj 1003求解方法 暴力求解

HDU——1231 連續序列

題目連結: 想複雜了 #include<iostream> #include<set> #include<string> #include<cmath> #include<cstring> #include<algorithm

hud1003Max Sum 連續序列的和

Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 293017 Accepted Submission(s): 6

Problem1231 連續序列

最大連續子序列 http://acm.hdu.edu.cn/showproblem.php?pid=1231   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K