動態規劃題目練習

2021-10-08 05:34:09 字數 2825 閱讀 9150

目錄

01揹包

300. 最長上公升子串行

198. 打家劫舍

62. 不同路徑

64. 最小路徑和

72. 編輯距離

做動態規劃題很重要的三個步驟:

第一步驟:定義陣列元素的含義確定狀態首先提取【最後一步】,用乙個陣列,來儲存歷史陣列,假設用一維陣列 dp 吧。這個時候有乙個非常非常重要的點,就是規定你這個陣列元素的含義,例如你的 dp[i] 是代表什麼意思?

第二步驟:找出陣列元素之間的關係式,我覺得動態規劃,還是有一點類似於我們高中學習時的歸納法的,當我們要計算 dp[n] 時,是可以利用 dp[n-1],dp[n-2].....dp[1],來推出 dp[n] 的,也就是可以利用歷史資料來推出新的元素值,所以我們要找出陣列元素之間的關係式,例如 dp[n] = dp[n-1] + dp[n-2],這個就是他們的關係式了。而這一步,也是最難的一步。

第三步驟:找出初始值。學過數學歸納法的都知道,雖然我們知道了陣列元素之間的關係式,例如 dp[n] = dp[n-1] + dp[n-2],我們可以通過 dp[n-1] 和 dp[n-2] 來計算 dp[n],但是,我們得知道初始值啊,例如一直推下去的話,會由 dp[3] = dp[2] + dp[1]。而 dp[2] 和 dp[1] 是不能再分解的了,所以我們必須要能夠直接獲得 dp[2] 和 dp[1] 的值,而這,就是所謂的初始值

由了初始值,並且有了陣列元素之間的關係式,那麼我們就可以得到 dp[n] 的值了,而 dp[n] 的含義是由你來定義的,你想求什麼,就定義它是什麼,這樣,這道題也就解出來了。

最基本的揹包問題就是01揹包問題(01 knapsack problem):一共有n件物品,第i(i從1開始)件物品的重量為w[i],價值為v[i]。在總重量不超過揹包承載上限cap的情況下,能夠裝入揹包的最大價值是多少?

第一步:dp[i][j]表示將前i件物品裝進限重為j的揹包可以獲得的最大價值,不是前i件都裝;

第二步:當 i > 0 時dp[i][j]有兩種情況:

裝不下,不裝入第i件物品,即dp[i−1][j]

能裝下,裝入第i件物品,即dp[i−1][j−w[i]] + v[i]

即狀態轉移方程為

dp[i][j] = max(dp[i−1][j], dp[i−1][j−w[i]]+v[i]) // j >= w[i]
第三步:dp[n+1][cap+1] :dp[0][j]表示0個物品裝入,價值為0;dp[i][0]揹包容量為0,裝不下任何東西,價值為0;

package cn.ren.demo;

public class solution ;

int value = new int ;

int cap = 20 ;

system.out.println(knapsack(weight, value, cap));

} public static int knapsack(int w, int v, int cap)

for (int j = 0; j < n; j ++ )

for (int i = 1; i < m; i ++ ) else

}} return dp[m-1][n-1] ;

}}

class solution 

public int dp(int nums)

for(int i = 0; i < nums.length; i++)

}max = math.max(max,dp[i]) ;

}return max ;

}}

class solution  else if(nums.length == 1)

int dp = new int[nums.length] ;

dp[0] = nums[0] ;

dp[1] = math.max(nums[0],nums[1]) ;

for( int i = 2; i < nums.length; i ++)

return dp[nums.length-1] ;

}}

class solution 

for( int j = 0; j < n; j ++)

for(int i = 1; i < m; i ++)

}return dp[m-1][n-1] ;

}}

class solution 

for( int j = 1; j < n; j ++)

for( int i = 1; i < m ; i ++)

}return dp[m-1][n-1] ;

}}

class solution 

for(int j = 1; j <= n; j ++)

for(int i = 1; i <= m; i ++) else }}

return dp[m][n] ;

}}

關於動態規劃題目的練習和總結

因為很多私募的演算法題都涉及了動態規劃類的題目,而且最近也在學習nlp在做乙個簡單的問答系統,也需要用到動態規劃所以就開始刷起動態規劃的題目了 字串最小替換次數 已知s1 和 s2兩個字串,操作有插入,刪除,替換,每次只能操作乙個字元,求吧s1變成s2的最小次數,比如s1 abd s2 ad s1去...

動態規劃練習

題目描述 給出兩個單詞word1和word2,計算出將word1 轉換為word2的最少操作次數。你總共三種操作方法 插入乙個字元 刪除乙個字元 替換乙個字元 include include include using namespace std int find min int x,int y,i...

動態規劃練習

題目描述 蘋果裝配問題,把乙個區域分成n m個小區域,其中每個區域有一定數量的蘋果,設左上角為0,0,右下角為n 1,m 1.從0,0開始出發,每經過乙個區域,就把該區域的蘋果全部收走,求一條路徑使得收穫的蘋果最多。include include using namespace std class ...