Leetcode 53最大子串行和

2021-10-04 06:00:28 字數 1174 閱讀 9298

int maxsubarray( vectornums) 

int res = dp[0];

for (int i = 1;i < len;i++)

return res;

}

第 1 步:定義狀態

既然乙個連續子陣列一定要以乙個數作為結尾,那麼我們就將狀態定義成如下。

dp[i]:表示以nums[i]結尾的連續子陣列的最大和。

第 2 步:思考狀態轉移方程

根據狀態的定義,由於nums[i]一定會被選取,並且dp[i]所表示的連續子串行與dp[i - 1]所表示的連續子串行(有可能)就差乙個nums[i]

假設陣列nums全是正數,那麼一定有dp[i] = dp[i - 1] + nums[i]

在一般情況下dp[i - 1]有可能是負數,例如前幾個數都是負數,突然來了乙個正數。

於是分類討論:

以上兩種情況的最大值就是dp[i]的值,寫出如下狀態轉移方程:

記為「狀態轉移方程 1」。

狀態轉移方程還可以這樣寫,反正求的是最大值,也不用分類討論了,就這兩種情況,取最大即可,因此還可以寫出狀態轉移方程如下:

記為「狀態轉移方程 2」。

動態規劃的問題經常要分類討論,這是因為動態規劃的問題本來就有最優子結構的特徵,即大問題的最優解通常由小問題的最優解得到,那麼我們就需要通過分類討論,得到大問題的小問題究竟是哪些。

第 3 步:思考初始值

dp[0]根據定義,一定以nums[0]結尾,因此dp[0] = nums[0]

第 4 步:思考輸出

這裡狀態的定義不是題目中的問題的定義,不能直接將最後乙個狀態返回回去。

輸出應該是把所有的dp[0]dp[1]、……、dp[n - 1]都看一遍,取最大值。 同樣的情況也適用於「力扣」第 300 題:「最長上公升子串行」。我經常在這一步「摔跟頭」,請各位也留意。

LeetCode 53 最大子串行和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。動態規劃 param...

Leetcode53 最大子串行和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。核心思想就是檢查之前 i 1 的元素和,如果小於零就捨棄 對應下面第六行 1 class solution 9return max nums 10 11 關於動態轉移方程建立的分析如下 摘自 1 clas...

LeetCode53最大子序和

給定乙個序列 至少含有 1 個數 從該序列中尋找乙個連續的子串行,使得子串行的和最大。例如,給定序列 2,1,3,4,1,2,1,5,4 連續子串行 4,1,2,1 的和最大,為6。擴充套件練習 若你已實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。一開始用的最簡單最直接的方法,挨個的把...