動態規劃法

2021-10-06 18:26:58 字數 1744 閱讀 7330

目錄

基本概念

力扣題       

5. 最長回文子串

70. 爬樓梯

322. 零錢兌換

動態規劃法利用問題的最優性原理,以

自底向上

的方式從子問題的最優解逐步構造出整個問題的最優解。

動態規劃法設計演算法一般分成三個階段: 分段

:將原問題分解為若干個相互重疊的子問題;

分析:分析問題是否滿足最優性原理,找出動態規劃函式的遞推式;

求解:利用遞推式

自底向上

計算,實現動態規劃過程。

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

示例 1:

輸入: "babad"

輸出: "bab"

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

示例 2:

輸入: "cbbd"

輸出: "bb"

本題定義乙個二維陣列d,d[i][j]的值的含義代表字串中的第i個字母到第j個字母組成的子串是否為回文。

該方法的好處是可以不用重複判斷,難點在於要思考狀態轉移方程。

class solution 

}return s.substring(begin,begin+max);

}}

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是乙個正整數。

示例 1:

輸入: 2

輸出: 2

解釋: 有兩種方法可以爬到樓頂。

1.  1 階 + 1 階

2.  2 階

示例 2:

輸入: 3

輸出: 3

解釋: 有三種方法可以爬到樓頂。

1.  1 階 + 1 階 + 1 階

2.  1 階 + 2 階

3.  2 階 + 1 階

這個問題可以被分解為一些包含最優子結構的子問題,即它的最優解可以從其子問題的最優解來有效地構建

因為第i階台階可以由第i-1階爬一階,還可以由第i-2階爬兩階得到。

class solution 

if(n==2)

int dp=new int[n];

dp[0]=1;

dp[1]=2;

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

示例 1:

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

輸出: 3 

解釋: 11 = 5 + 5 + 1

示例 2:

輸入: coins = [2], amount = 3

輸出: -1

class solution }}

return dp[amount]==amount+1?-1:dp[amount];

}}

動態規劃法

在學習動態規劃法之前,我們先來了解動態規劃的幾個概念 1 階段 把問題分成幾個相互聯絡的有順序的幾個環節,這些環節即稱為階段。2 狀態 某一階段的出發位置稱為狀態。3 決策 從某階段的乙個狀態演變到下乙個階段某狀態的選擇。4 狀態轉移方程 前一階段的終點就是後一階段的起點,前一階段的決策選擇匯出了後...

動態規劃法

有些問題在分解時會產生許多子問題,且分解出的自問題互相交織,因而在解這類問題時,將可能重複多次解乙個子問題。這種重複當然是不必要的,解決方法可以在解決每個子問題後把它的解 包括其子子問題的解 保留在乙個 中,若遇到求與之相同的子問題時,dp演算法又稱動態規劃,是資訊學競賽中選手必須熟練掌握的一種演算...

動態規劃法

最近遇到了一道挺有意思的演算法題 四種硬幣 1元3元4元5元 問 想要湊成n元錢最少幾枚硬幣?public class coinsgamemain fun 7,is public static void fun int k,int is i1 l min i2 if l k private stat...