動態規劃(一)——從爬樓梯問題簡單理解dp

動態規劃

​ 今天來談一談我對動態規劃的理解,我也是初學者,這裏只是通過爬樓梯這道簡單的問題,介紹一下動態規劃的核心思想和基於這道題的 DP 分析

dp 思想

​ 動態規劃(一下簡稱 dp)是一種將多個階段的問題分解成一系列單階段問題,通過總結各階段之間的關係得到所謂的狀態轉換方程,從而解決問題

​ dp 算法不同於二分、快排、雙指針等算法,存在一個大致的模板,dp 問題因爲問題要求不盡相同,推導 dp 方程的過程也不盡相同,但是我們還是可以總結一個答題流程,這裏借鑑AcWing閆學燦老師的閆氏 DP 分析法

通過爬樓梯問題來理解 dp

​ 先看題目

題目

​ 假設你正在爬樓梯,需要n階才能到達樓頂,每次你可以爬12個臺階,我們有多少種方法可以到達樓頂呢?(n是一個整數)

dp 思路

​ dp 問題雖然沒有固定的模板,但是我們可以根據經驗總結出一個解題的思路,經過總結,我們認爲 dp 問題分爲狀態表示狀態計算兩步,我們依次說明

​ 我們需要根據一個問題,抽象出一個結果的集合,假設爲dp[i],它用來表示到達第 i 個臺階的方法數,這是一個化整爲零的過程,我們稱爲狀態表示,dp[i]所表示的含義我們稱之爲它的屬性

​ 隨後,我們要通過總結dp[i]的特點或者性質,給dp[i]進行劃分,這裏劃分的依據通常是尋找最後一個不同點,那麼這個問題的劃分點是哪裏呢,很明顯是還有1步到第i還有2步到第i,這裏劃分時我們需要注意,我們劃分的區間應該包含所有可能存在的情況,並且每個區間都會重複,劃分後,我們要通過dp[i]去表示兩個區間,很簡單,前者是dp[i - 1],後者是dp[i - 2],到這裏,這道題的思路就很明確了,因爲我們已經得到了它的 dp 方程:dp[i] = dp[i - 1] + dp[i - 2],我們只需要用代碼來實現即可

代碼

int dp(int stairs) {
    if (stairs == 1)
        return 1;
    int dp[stairs + 1];
    dp[1] = 1;
    dp[2] = 2;
    for (int i = 3; i <= stairs; ++i) dp[i] = dp[i - 2] + dp[i - 1];
    return dp[stairs];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章