算法學習二----求子數組的最大和

題目如下:

輸入一個整型數組,數組裏有正數也有負數。
數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。
求所有子數組的和的最大值。要求時間複雜度爲O(n)。

例如輸入的數組爲1, -2, 3, 10, -4, 7, 2, -5,和最大的子數組爲3, 10, -4, 7, 2,
因此輸出爲該子數組的和18。

注:有些題目要求的是如果序列全爲負數就返回0,但此函數中,如果序列全爲負數,則返回最大的負數

這是一個經典的動態規劃問題。首先要建立動態規劃的狀態方程
定義數組b,設b[j]表示第j處,以a[j]結尾的子序列的最大和,則
b[j] = max{a[j] + b[j-1], a[j]},所以要求的答案就是數組b中的最大值

算法實現的僞代碼如下:
define array b, sum=a[0], b[0] = a[0]
for i <- 0 to 10
    b[j] = max{a[j] + b[j-1], a[j]}
    sum = max{sum, b[i]
return sum


C++實現

template <typename T>
T MaxConSum(const T *a, int n)
{
	//initialize
	T b[n];
	T sum = a[0];
	b[0] = a[0];

	for(int i = 1; i != n; ++i)
	{
		//use state equation to assign array b
		b[i] = max(a[i], b[i-1] + a[i]);
		if(sum <= b[i])
		{
			//sum store the max value of array b
			sum = b[i];
		}
	}

	return sum;
}


發佈了90 篇原創文章 · 獲贊 45 · 訪問量 71萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章