N 組連續子串最大和

2022-07-29 05:03:13 字數 1618 閱讀 4525

陣列 a 中有 m 個數 , 將 m 個數分成 n 組 , 並且每組中的資料順序和原陣列中的順序保持一致,求 n 組中的資料之和最大為多少?

向 dp 陣列中賦初始值 ,如果 m == n ,則 dp[ i ][ i ] = dp[ i - 1 ][ i - 1 ] + a[ i ] ;

若n為1時 ,即為求連續子串最大和問題;

假設dp[ 1 ][ i ] ( 2 =< i <= m) 代表 與第 i 個數組成連續子串的最大和,當dp[ 1 ][ i - 1 ] < 0 時 , a[ i ] 獨立作為乙個子串 , 即 dp[ 1 ][ i ] = max ( dp[ 1 ][ i -1 ] + a[ i ] , a[ i ] ) ;很需要注意的一點是:dp[ 1 ][ i ] 不一定是 i 個數中連續子串的最大和。

分別求出陣列中有乙個數、兩個數、三個數……m個數中連續子串的最大和,用dp[ i ][ 1 ] 來表示;

若n為2時,表示將m個數分成 2 組 ,求兩組數中的和最大 ;

dp[ 2 ][ i ] ( 3 =< i <= m ) 代表 與第 i 個數組成連續子串,形成兩個連續子串中,第2個子串的最大和;

可知,第二個子串可以單獨成為一段,最終形成兩段,也可以和上乙個段一起形成一段,最終形成兩段;

所以 dp[m][n]  代表 與第m個數組成的連續子串的最大和,但不一定是 m 個數中連續子串的最大和 ;

與第 m 個數組成連續子串時 ,第 m 個數可以與第 m-1 個數組成的子串組合,也可以獨立作為乙個子串 , 與  m-1 個數組成的(n-1)組連續子串中最大和組合 ,才能達到分成 n 組的效果;

最後輸出dp陣列中最大值,即為 n 組中資料之和的最大值;

下面給出相應的**:

#includeusing namespace std ;

#define m 100005

#define max(x,y) ((x) > (y) ? (x) : (y))

int a[ m ] , dp[ m ][ m ] ;

int main()

} int max1 = -(1<<30) ;

for(i = k ; i <= n ; i++)

max1 = max(max1,dp[k][i]) ;

cout << max1 << endl ;

} return 0 ;

}

上面的**空間複雜度比較高,但通過觀察可以得到,依照滾動陣列的思想,讓dp陣列的行數為2,在兩行中迴圈,這樣輕易一改,省去了很多空間:

有木有很強大!!!      思維決定到效率!!!

#includeusing namespace std ;

#define m 100005

#define max(x,y) ((x) > (y) ? (x) : (y))

int a[ m ] , dp[ 2 ][ m ] ;

int main()

} int max1 = -(1<<30) ;

for(i = k ; i <= n ; i++)

max1 = max(max1,dp[k&1][i]) ;

cout << max1 << endl ;

} return 0 ;

}

最大和連續子串

輸入一組整數,求出這個整數陣列最大和的連續 子串。例如,整數陣列為,最大和的連續子串為,最大和為61。需要注意的是要求子串連續,另外,子串的長度可以是1.這個也是曾經出過的一道面試提,最早是浙大的一道考研演算法設計題。第一種方法。最簡單的思路就是用兩層迴圈來解決問題。外面一層是從1到整數陣列的長度,...

最大和連續子陣列

問題描述 乙個數值型陣列,其子陣列有多個,求其子陣列中最大的和值。所謂和值,是指數組所有元素相加的和。解法 1 掃瞄法,維護max變數,儲存最大和,其初始值為data 0 假設最大和子陣列的第一位下標為i,i從0到n 1,對於每個i值,從data i 開始,進行累加,每加乙個數,與max變數比較一次...

連續子陣列最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...