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 的解法,嘗試使用更為精妙的分治法求解。一開始用的最簡單最直接的方法,挨個的把...