力扣動態規劃問題求解思路

2021-10-10 05:02:21 字數 1431 閱讀 8525

定義:

動態規劃演算法是通過拆分問題、定義問題狀態和狀態之間的關係,使得問題能夠以地推(或者說分治)的方法解決。動態規劃演算法的基本思想與分治法類似,也是將待求解的問題分解為若干個子問題(階段),按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的區域性解,通過決策保留那些有可能達到最優的區域性解,丟棄其他區域性解。依次解決各子問題,最後乙個子問題就是初始問題的解。

基本思想與策略編輯

由於動態規劃問題解決的問題多數有重疊子問題這個特點,為了減少重讀計算,對每乙個子問題只求解依稀,將其不同階段的不同狀態儲存在乙個二維陣列中。

首先是拆分問題:

根據問題的可能性將問題劃分成一步一步這樣就可以通過遞推或者遞迴來實現。動態規劃這一類問題就是從後往前推導,有時候很容易就知道:如果只有一種情況時,最佳的選擇應該怎麼做,然後根據這個最佳選擇往前一步進行推導,得到前一步的最佳選擇。

然後定義問題狀態和狀態之間的關係

拆分步驟之間的關係,用一種量化形式表現出來。

定義下面的兩段

比如我們找到了最優解,我們應該將最優解儲存下來,為了往前推導時能夠使用前一步的最優解,在這個過程中難免有一些相比最優解差的解,此時我們應該放棄,只儲存最優解,這樣我門每一次都把最優解儲存下來了,大大降低了時間複雜度。

可以看出每走第n行第m列時有兩種後續:向下或者向右下1、將原問題分解為子問題(開頭已經介紹了怎麼分解) (注意:1,子問題與原問題形式相同或類似,只是問題規模變小了,從而變簡單了; 2,子問題一旦求出就要儲存下來,保證每個子問題只求解一遍)

2、確定狀態(狀態:在動規解題中,我們將和子問題相關的各個變數的一組取值,稱之為乙個"狀態",乙個狀態對應乙個或多個子問題所謂的在某個狀態的值,這個就是狀態所對應的子問題的解,所有狀態的集合稱為"狀態空間".我的理解就是狀態就是某個問題某組變數,狀態空間就是該問題的所有組變數) 另外:整個問題的時間複雜度就是狀態數目乘以每個狀態所需要的時間

3、確定一些初始狀態(邊界條件)的值 (這個視情況而定,千萬別以為就是最簡單的那個子問題解,上面只是例子,真正實踐動規千變萬化)

4、確定狀態轉移方程 (這一步和第三步是最關鍵的 記住"人人為我"遞推,由已知推未知)

適合使用動規求解的問題:

1,問題具有最優子結構

2,無後效性 說的花裡胡哨的,其實一般遇到求最優解問題一般適合使用動態規劃

力扣 動態規劃

設爬x層的梯子的方法有f x 種,那麼f x f x 1 f x 2 爬1層梯子的方式有一種 爬2層梯子的方式有兩種 爬3層梯子的方式有三種 爬4層梯子的方式有五種 classsolution int rev newint n 1 rev 0 0 rev 1 1 rev 2 2 for inti 3...

力扣 動態規劃 最低票價

問題描述 在乙個火車旅行很受歡迎的國度,你提前一年計劃了一些火車旅行。在接下來的一年裡,你要旅行的日子將以乙個名為 days 的陣列給出。每一項是乙個從 1 到 365 的整數。火車票有三種不同的銷售方式 一張為期一天的通行證售價為 costs 0 美元 一張為期七天的通行證售價為 costs 1 ...

力扣 動態規劃(DP)問題分類彙總(二)

回文區間dp模板 for int i 0 i n i for int i n 1 i 0 i 題目一 回文子串 647.回文子串 題解 對於字串的dp,一般要用二維陣列求解。引入兩個指標dp i j 這個狀態是字串區間dp i 1 j 1 轉移而來的,結果是有s i s j 是否成立來確定。如下 c...