486,動態規劃解最大子序和

2021-10-13 18:04:56 字數 1534 閱讀 8053

問題描述

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4]

輸出: 6

解釋: 連續子陣列[4,-1,2,1]的和最大,為6。

動態規劃解決這題是讓求最大的連續子序和,如果不是連續的非常簡單,只需要把所有的正數相加即可。但這裡說的是連續的,中間可能摻雜負數,如果求出乙個最大子序和在加上負數肯定要比原來小了。解這題最簡單的一種方式就是使用動態規劃。

我們先來了解一下動態規劃的幾個步驟

1,確定狀態

2,找到轉移公式

3,確定初始條件以及邊界條件

4,計算結果。

最後乙個不用看,只看前3個就行,因為前3個一旦確定,最後乙個結果也就出來了。我們試著找一下

1,定義dp[i]表示陣列中前i+1(注意這裡的i是從0開始的)個元素構成的連續子陣列的最大和。

2,如果要計算前i+1個元素構成的連續子陣列的最大和,也就是計算dp[i],只需要判斷dp[i-1]是大於0還是小於0。如果dp[i-1]大於0,就繼續累加,dp[i]=dp[i-1]+num[i]。如果dp[i-1]小於0,我們直接把前面的捨棄,也就是說重新開始計算,否則會越加越小的,直接讓dp[i]=num[i]。所以轉移公式如下

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

3,邊界條件判斷,當i等於0的時候,也就是前1個元素,他能構成的最大和也就是他自己,所以

dp[0]=num[0];

找到了上面的轉移公式,**就簡單多了,來看下

public

intmaxsubarray

(int

num)

return max;

}

**優化仔細看下上面的**會發現,我們申請了乙個長度為length的陣列,但在轉移公式計算的時候,每次計算當前值的時候只會用到前面的那個值,再往前面就用不到了,這樣實際上是造成了空間的浪費。這裡不需要乙個陣列,只需要乙個臨時變數即可,看下**

public

intmaxsubarray

(int

num)

return max;

}

總結動態規劃最重要的3步就是先確定狀態,最關鍵的是找出轉移公式,最後再確定邊界條件,防止陣列越界等問題,這3步確定以後基本上就能解決了。

最大子序和 動態規劃

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。def maxsubarray nums length len nums for i in ...

動態規劃 最大子序和

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 1 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6 示例 2 輸入 nums 1 輸出 1 示例 3 輸入 nums 0 輸出 0...

動態規劃 最大子序和

今天總結一下有關動態規劃問題中最大子序和的問題。53.最大子陣列和 題目要求給定乙個陣列,讓我們求出最大連續子陣列的和。我們使用動態規劃來解決此類問題。dp i 表示以nums i 結尾的連續子串行的和的最大值。那麼我們要求的答案就是max.其狀態轉移方程很容易就看出為dp i max dp i d...