7 1 最大子列和問題 (20分)

2022-01-26 03:43:51 字數 1874 閱讀 7256

給定\(k\)個整數組成的序列\(\),「連續子列」被定義為\(, ..., n_j}\),其中\(1≤i≤j≤k\)。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。

本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下:

資料1:與樣例等價,測試基本正確性;

資料2:102個隨機整數;

資料3:103個隨機整數;

資料4:104個隨機整數;

資料5:105個隨機整數;

輸入第1行給出正整數\(k (≤100000)\);第2行給出\(k\)個整數,其間以空格分隔。

在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。

6

-2 11 -4 13 -5 -2

20

這是一道動態規劃的題目。

先來個dp陣列,是一維的還是二維的?

首先,不讀完整個序列,無法確定連續最大子列。

嘗試遞迴

在讀入第i個數,就確定了,直到i的連續最大子列,和也知道。

那麼讀入第i+1個數。既然是最大,那麼負數一定要排除。所以第i個數若是負數(情況1),此時必定不是最大子列的元素。

第i個數若是正數,也不一定是最大子列的元素,因為可能,最大子列吸收它的代價太高。

看第i+1個數,(情況1),如果能夠補償i的損失。

(情況2),能夠彌補吸收的代價。

失敗。嘗試遞推

這裡的底層元素,顯然就是每乙個數本身。

性質分類就是 + - 。

如果i以後的數和為正,那麼最大子列會吸收後續所有

最大連續子列

9:15 2019/1/23 第二天思考。

dp陣列應該是一維的。

對dp[i]先做初始化,在開頭遇到的負數,其dp都為0

遇到第乙個正數,及之後的所有數,dp為其本身。

/*這是主要方程,但不是全部*/

dp[i] = dp[i+1]+a[i];

10:34 2019/1/23 成功ac,對狀態轉移方程做了詳細的定義。

分析了4種情況。我的想法是讓人「未卜先知」,或者說是看到未來,所以是從最後一位數的dp來思考的。dp記錄的是最大連續子列吸收該數的後果。要做到這一點,必須已經讀入整個序列,從最後乙個數開始考慮。因為隨著後續數的不同,對某個數吸收與否的命運會改變。

如果已經知道吸收乙個數的後果,就可以判斷是否應該吸收了。

同時,吸收該數,希望吸收最小的壞後果,所以要對(a[i]>0 && dp[i+1]<0)特判,這種情況下,最優策略是僅僅吸收該整數本身。

#includeusing namespace std;

int main(void)

else if(flag)

else

i++;

} // for(int i =0;i=0;i--)

else

dp[i] = dp[i+1] + a[i]; }

cout《參考胡凡的書,這裡對狀態轉移方程可以優化一波。

for(int i=n-2;i>=0;i--)

我的狀態轉移方程也是滿足無後效性的。

從頭開始的動態規劃,就是定義了dp陣列元素dp[i]為以a[i]結尾的連續子列最大和。

dp[i] = max(a[i],dp[i-1] + a[i]);

對最大和條件做了弱化,或者說是定義修改。

接著找出,這些和中值最大的那乙個。

7 1 最大子列和問題 20 分

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下 資料1 與樣例等價,...

7 1 最大子列和問題 20分

7 1 最大子列和問題 20分 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資...

7 1 最大子列和問題 20分

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下 輸入第1行給出正整數...