動態規劃總結(1)

2021-10-03 21:04:31 字數 2338 閱讀 1825

今日開始稍微學習動態規劃,前來總結下每日戰績、

例如,給定三角形:

[[2

],[3

,4],

[6,5

,7],

[4,1

,8,3

]]

自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。

class

solution

}return f[0]

;}}

之前做過不同路徑i ,也是乙個動態規劃,這道題多了一些障礙物,但是依然是一道典型的動態規劃問題。

乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。

輸入:[

[0,0,0],

[0,1,0],

[0,0,0]

]輸出:

2解釋: 3x3 網格的正中間有乙個障礙物。

從左上角到右下角一共有 2 條不同的路徑:

向右 -> 向右 -> 向下 -> 向下

向下 -> 向下 -> 向右 -> 向右

class

solution

}return f[n-1]

[m-1];

}}

給定乙個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。

示例 1:

輸入: 2

輸出: [0,1,1]

常規思路 分別遍歷求每個數1的個數即可

但是題目要求採用o(n)的時間,

那麼這麼想,如果求5中1的個數,5的二進位制表示是101

不看最後一位 前兩位中1的個數也就是2中1的個數

因此狀態轉移方程為 f[i

]=f[

i>

>1]

+(i&

1)

f[i]=f[i>>1]+(i\&1)

f[i]=f

[i>

>1]

+(i&

1)

class

solution

return f;

}}

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

輸入: coins = [1, 2, 5], amount = 11

輸出: 3

解釋: 11 = 5 + 5 + 1

思考:他讓求最少硬幣個數,那麼狀態轉移就是一直+1,最後判斷最後的乙個狀態是否滿足要求。

狀態轉移方程 f[n

]=mi

n(f[

n],f

[n−j

]+1)

f[n]=min(f[n],f[n-j]+1)

f[n]=m

in(f

[n],

f[n−

j]+1

)另外,除了第乙個,其他都需要置乙個很大的值,比總金額大即可

class

solution

}

輸入: nums =

[[9,9,4],

[6,6,8],

[2,1,1]

]輸出: 4

解釋: 最長遞增路徑為 [1, 2, 6, 9]。

這道題,其實主要考察的應該是深搜+記憶化搜尋。

遍歷每個元素,然後從每個元素為中心深搜,之後將引數儲存起來,下次如果在緩衝區,直接拿來用。

**如下

class

solution

,dy=

;private

static

int[

] dp ;

public

intdfs

(int

matrix,

int x,

int y)

return dp[x]

[y];

}public

intlongestincreasingpath

(int

matrix)

}

動態規劃1(DP)總結

遞迴是最簡單也是最直接的思路,分解小問題,然後得到最終問題的答案。但是遞迴 簡單,但是比較耗時。所以我們思路可以用遞迴,但是出於 效能考慮,還是要提公升效率。這當然是後期的優化了。動態規劃,回溯都是比較常用也比較常見的演算法。這篇來講動態規劃。動態規劃的核心 問題的最優解可以由子問題的最優解得到,那...

動態規劃1

維基百科 動態規劃是一種在數學和 電腦科學 中使用的,用於求解包含 重疊子問題 的最優化 問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有 求解 最短路徑 問題,揹...

動態規劃 1

動態規劃是對最優化問題的一種新的演算法設計方法。由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的沒計法對不同的問題,有各具特色的表示方式。不存在一種萬能的動態規劃演算法。但是可以通過對若干有代表性的問題的動態規劃演算法進行討論,學會這一設計方法。多階段決策過程最優化問題 動態規劃的...