DP問題集 動態規劃試題

2021-06-25 21:04:03 字數 1108 閱讀 7275

1.揹包問題

給定n種物品和一揹包。物品i的重量是wi,其價值為pi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?

分析:①每個物品只有兩種選擇,要麼就是塞到包裡面,要麼就是不要了;

②當揹包剩餘容量為j時,如果第i件物品重量wi>j時,必定是要不了的,如果wi③假設剩餘容量j的揹包從i到n這n-i+1種物品中能選出的最大總價值記為m[i,j],那麼對於原問題:容量為c的揹包,從1到n中物品中能選出的最大總價值則可以記為m[1,c];

④尋找遞推式——動態規劃,其實就是用遞推來代替遞迴,利用多個相同或者不同的子問題的輸出得出乙個包含這些子問題的輸出,是典型的犧牲空間換取速度的做法。

那麼m[i,j]可以分為兩種情況

當已知m[i+1,j]時,

m[i,j] = m[i+1, j] , wi>j

m[i,j] = max(m[i+1, j], m[i+1, j-wi]+pi) , wi舉個例子:

假設現有5種物品,且它們的重量和價值分別如下所示:n1

2345

wi123

45pi2

3647

揹包容量為7。

j\i123

4512

0000

2330

0036

6600

4866

4059

9777

61197

777?=11

101077

那麼根據上面的遞推公式,我們試試解出m[1,7]=max(m[2,7], m[2,7-1]+2)=max(m[2,7], m[2,6]+2)=max(10, 9+2)=11。

2.最長遞增序列

給定乙個序列,求至少刪除幾個數,使得序列呈遞增序列,返回最長遞增序列長度。(遞增序列要求ai≤ai+1)

《分析明天給出,敬請期待》

#include #include int input_array(int **a)

else

break;

}} if(mk==-1)

} free(m);

return mlen;

}int main(void)

dp(動態規劃問題)

先講一下dp的一般思路吧 將原問題分解為子問題 1 把原問題分解為若干個子問題,子問題和原問題形式相同 或類似,只不過規模變小了。子問題都解決,原問題即解 決 數字三角形例 2 子問題的解一旦求出就會被儲存,所以每個子問題只需求解一次。確定狀態 在用動態規劃解題時,我們往往將和子問題相關的各個變數的...

動態規劃 dp

威威貓系列故事 打地鼠 威威貓最近不務正業,每天沉迷於遊戲 打地鼠 每當朋友們勸他別太著迷遊戲,應該好好工作的時候,他總是說,我是威威貓,貓打老鼠就是我的工作!無話可說.我們知道,打地鼠是一款經典小遊戲,規則很簡單 每隔乙個時間段就會從地下冒出乙隻或多隻地鼠,玩遊戲的人要做的就是打地鼠。假設 1 每...

動態規劃,dp

線性動規區間動規樹形動規 區間動規 根據題目要求,全域性最優滿足區域性最優 典型題例 加分二叉樹 洛谷1040 題目介紹 題目描述 設乙個n 個節點的二叉樹t 的中序遍歷為 1,2,3,n 其中數字 1,2,3,n 為節點編號。每個節點都有乙個分數 均為正整數 記第j 個節點的分數為dj。二叉樹t ...