LeetCode分類訓練 Task 2動態規劃

2021-10-23 14:53:47 字數 3222 閱讀 2570

群內編號:2-木鐸鐸

博文內容學習自datawhale開源文件:

leetcode分類訓練 task 2 動態規劃

動態規劃常常適用於有重疊子問題最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。

要解乙個給定問題,需解其不同子問題,再根據子問題的解得出原問題的解。動態規劃(dp)往往用於優化遞迴問題,如斐波那契數列,運用遞迴的方式求解會重複計算很多相同子問題,利用dp思想可減少計算量。

dp僅僅解決每個子問題一次,具有天然剪枝的功能,從而減少計算量。一旦某個給定子問題的解已經算出,則將其記憶化儲存,下次需要同乙個子問題的解時查表即可

動態規劃模板步驟:

題目描述

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

示例:

輸入:[10

,9,2

,5,3

,7,101,18

]輸出:

4 解釋: 最長的上公升子串行是 [2,

3,7,

101],它的長度是 4。

說明:

可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。

你演算法的時間複雜度應該為 o(n^

2) 。

第一步:確定動態規劃狀態

該題目可以直接用乙個一維陣列dp來儲存轉移狀態,dp[i]可以定義為以nums[i]這個數結尾的最長遞增子串行的長度。

第二步:寫出狀態轉移方程

for i in

range

(len

(nums)):

for j in

range

(i):

if nums[i]

>nums[j]

: dp[i]

=max

(dp[i]

,dp[j]+1

)

tips:在實際問題中,如果不能很快得出這個遞推公式,可以先嘗試一步一步把前面幾步寫出來,如果還是不行很可能就是 dp 陣列的定義不夠恰當,需要回到第一步重新定義 dp 陣列的含義;或者可能是 dp 陣列儲存的資訊還不夠,不足以推出下一步的答案,需要把 dp 陣列擴大成二維陣列甚至三維陣列。

第三步:考慮初始化條件

這是決定整個程式能否跑通的重要步驟,當我們確定好狀態轉移方程,我們就需要考慮一下邊界值,邊界值考慮主要又分為三個方面

對於本問題,子串行最少也是自己,所以長度為1,這樣我們就可以方便的把所有的dp初始化為1,再考慮長度問題,由於dp[i]代表的是nums[i]​的最長子序列長度,所以並不需要加一。 所以用**表示就是​dp=[1]*len(nums)

第四步:考慮輸出狀態

主要有以下三種形式,對於具體問題,我們一定要想清楚到底dp陣列裡儲存的是哪些值,最後我們需要的是陣列中的哪些值:

最後加上考慮陣列是否為空的判斷條件,下面是該問題完整的**:

def

lengthoflis

(self, nums: list[

int])-

>

int:

ifnot nums:

return

0#判斷邊界條件

dp=[1

]*len(nums)

#初始化dp陣列狀態

for i in

range

(len

(nums)):

for j in

range

(i):

if nums[i]

>nums[j]

:#根據題目所求得到狀態轉移方程

dp[i]

=max

(dp[i]

,dp[j]+1

)return

max(dp)

#確定輸出狀態

第五步:考慮對時間,空間複雜度的優化(bonus)

請參見:

二分方法+動態規劃詳解

題目描述

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例 1:

輸入:"babad"

輸出:"bab"

注意:"aba" 也是乙個有效答案。

第一步:確定動態規劃狀態

這裡定義dp[i][j]表示子串s從i到j是否為回文子串。

第二步:寫出狀態轉移方程

# 字串首尾兩個字元必須相等,否則肯定不是回文

if s[i]

==s[j]

:# j-1-(i+1)+1<2

if j-i<3:

dp[i]

[j]=

true

else

: dp[i]

[j]=dp[i+1]

[j-1

]

第三步:考慮初始化條件

由於只有乙個字元的時候肯定是回文串,所以dp**的對角線dp[i][i]肯定是true。

第四步:考慮輸出狀態

這裡dp表示的是從i到j是否是回文子串,這樣一來就告訴我們子串的起始位置和結束位置。

if dp[i]

[j]:

# 只要dp[i][j]成立就表示是回文子串,之後記錄位置,返回有效答案

cur_len=j-i+

1if cur_len>max_len:

max_len=cur_len

start=i

第五步:考慮對時間,空間複雜度的優化

請參考下面的題解:

動態規劃、manacher 演算法

動態規劃除了解決子串行問題,也可以用來解決其他實際的問題,比如一些ai的經典演算法。本文只簡單記錄了一些基礎的用法和2道經典的題目,更詳細的分析和更多的例子請見原文(位址在本文頂部)。日後對dp演算法還要多多應用,多多理解^ _ ^

DataWhale 統計學一周訓練營 task1

參考 學習內容 一 可汗學院統計學12 26集,統計學基礎知識 二項分布及泊松分布 學習內容 二 可汗學院統計學27 34集,大數定理 正態分佈 其他資料 深入淺出統計學 商務與經濟統計 二項分布 泊松分布 泊松分布由二項分布推導而來。泊松過程 把單位時間分為無限份,每乙份的概率為 隨機變數x符合二...

DataWhale 統計學一周訓練營 task3

第一型錯誤 在假設檢驗中,接受或者拒絕h0,都有概率犯錯誤。第一類錯誤就是原假設為真,而檢驗的結論卻勸你放棄原假設,稱為棄真錯誤。如果原假設不是真,而檢驗的結論卻勸你接受原假設稱為取偽錯誤。顯著性水平 當作為乙個等式的原假設為真時,犯第一類錯誤的概率稱為檢驗的顯著性水平,用 表示,一般取0.05 和...

OpenCV訓練分類器

opencv訓練分類器 一 簡介 目標檢測方法最初由paul viola viola01 提出,並由rainer lienhart lienhart02 對這一方法進行了改善。該方法的基本步驟為 首先,利用樣本 大約幾百幅樣本 的 harr 特徵進行分類器訓練,得到乙個級聯的boosted分類器。分...