DP題解 求最大子陣列和問題(問題拓展)

2021-09-12 18:29:04 字數 1993 閱讀 3691

[dp題解] 求最大子陣列和問題(問題拓展)

問題描述最大

連續子陣列和

對乙個有

n個元素的陣列,

求最大的連續子陣列的和,並求其開始、結束下標。

陣列的元素必然有正數也有負數才有意義:

如果全是正數,那最大的子陣列就是本身;

如果全部為負數,那最大子陣列就是空陣列(返回最大和為0);

如果陣列的元素有正值有負值,那最大子陣列的和一定為0或者正值。

例如下面的

陣列:-2,1,-3,4,-1,2,1,-5,4

這個問題中:

最大連續子陣列和為:6;下標範圍為:[3,6]

如圖所示:

再例如給定陣列: 

演算法設計:

1. 對於找出的最大連續子串行,用start代表開始元素下標;end代表結束元素下標。令:start = end = 0;

2. 設定變數max表示最大和,賦初值 max = 0;

3. 設定兩個變數 temp 和 ts,並賦初值均為0;

4. 從陣列中的第乙個元素開始遍歷陣列:

用temp用來存放從第乙個陣列元素開始的累加和;如果temp小於0,則說明這些陣列元素之和為負值,不可能為最大值;所以將0賦值給temp;同時 ts賦值:ts=i+1。如果temp不小於0,則比較temp與max誰大;如果temp大於max,則記錄元素座標start = ts,end = i;同時說明找到了新的最大值,那麼將temp中新的最大值賦給max,即: max = temp。

這裡需要注意:

(1)max 始終用來存放連續子串行的最大和; temp是乙個臨時用於存放連續陣列和的變數,一旦滿足 temp大於max,則進行賦值操作,是max中始終存放的是最大和;

(2)對於temp而言:如果temp小於零,則說明之前累加和的元素和不是最大值。可以直接捨棄這些元素了。所以從當前元素(下標為i)之後的元素(ts = i+1)開始重新累加和。並且 temp = 0。

(可能元素都為負值;也可能有正值,負值,但是累加和為負值時,不可能成為最大和。根據題目要求最大和是0或者正值;當陣列元素全為負值時,最大和為0)

public static void maxsum(int nums)  else 

}} system.out.println("maxsum = " + max + ", start : " + start + ", end = " + end);

}

完整的測試**如下:

package com.bean.algorithmexec;

public class maxsumofcontinuoussubarray else

}} system.out.println("maxsum = " + max + ", start : " + start + ", end = " + end);

} public static void main(string args) ;

//int demo = new int ;

/** 例如給定序列,其最大連續子串行為,最大連續子串行和即為20。

* */

//int demo = new int ;

for (int i = 0; i < demo.length; i++)

system.out.println();

maxsum(demo);

}}

最大子陣列問題 DP

題目 參考 解法 1.窮舉法 即求x 0.n 1 中x i.j 的之和的最大值,使用最普通的方法計算出任何x i,j 之間各個和的最大值,然後取最大值。經過兩次迴圈,實際複雜度 o n 2 2.分治法 將原始向量x分為兩個大小近似相等的子向量a和b,然後遞迴地找出a,b中元素總和最大的子向量ma和m...

陣列問題之求最大子陣列問題(一)

結束了 四則運算的所有內容 這次老師布置了 陣列問題 求最大子陣列的問題 課堂上 老師就已經提供了數種方案 並提出了時間複雜度的要求 於是和我的搭檔找到了認為最為簡便的演算法 過程中和小於0,那麼和最大的子陣列不會包含前面子陣列,之後將和歸0,從下個元素重新開始計算 於之前的實驗 理清思路 實現不算...

最大子陣列和問題

演算法導論在分治策略一章中提到了最大子陣列和問題,我用c 實現了一下,還是挺簡單的,只不過要return最大子陣列的起始下標 結束下標和最大子陣列和這三個數有點麻煩,如要使用引用的話,因為要遞迴傳值所以不好實現,乙個可行的辦法是使用陣列,將這三個值放在陣列中傳遞。lz這裡並沒有寫這一過程。分治演算法...