動態規劃初步探索

2021-05-26 06:43:58 字數 1289 閱讀 5827

下面用乙個很簡單的例子來具體說明一下dp問題的解題過程。題目如下

描述在乙個星期三的早上,某同學想用扔硬幣的方式來決定是否要去上演算法課。

他扔 n 次硬幣,如果當中有連續 m 次以上(含 m 次)的結果都是正面,那麼他就去上課,否則就接著睡覺。(假設每次扔硬幣扔出的正反兩面的概率都是 0.5。)輸入

輸入的每行有一組資料,分別為 n 和 m (0 < n

<= 2000, 0 < m

<= 10)。輸入以 0 0 結尾。

輸出對於每組資料,輸出他去上課的概率,四捨五入保留小數點後 2 位。

樣例輸入

1 1

2 15 5

100 5

2000 5

2 30 0

樣例輸出

0.50

0.75

0.03

0.81

1.00

0.00

dp問題首先是需要打表,我們根據他的資料要求開乙個陣列,大小為2001, dp[2001]。這個陣列用來存放子問題的解,比如dp[i]就代表投完第i個硬幣時,已有連續m個正面的概率。具體假如m是2,dp[0],dp[1]肯定0,因為投幣0次或1次不可能出現連續兩次正面。

分三種情況討論:

1. n小於m,即dp陣列下標i要小於m的時候,概率值都為0,原因如上所述。

2. 下標i等於m,也就是說n等m,投多少次剛好多少次是正面,這個概率是0.5的m次方

3. 下標i大於m,即n大於m的時候,這個又要分兩種情況,概率是這兩種情況之和:

(1). 在i之前已經有m次連續了,如果恰好前面第i-1個是連續m次,那第i次如果是正面的話就是連續m+1次符合題目要求,如果第i次是反面的話那恰好就是m次也滿足題目,也就是說他第i次無論是正面還是反面都滿足條件,所以dp[i]的概率第一種情況由dp[i-1]組成。

(2). 第i次的時候恰好連續了m次,也就是說他前面m-1次都是正面,那他前面m次的那次是必須是乙個反面,否則不能剛好在第i次的時候連續m次正面了。他前面m次的那次是乙個反面,那個反面的前一次有連續m次的概率是dp[i-(m+1)],那他沒有連續m次正面的概率是1-dp[i-(m+1)],他後面的那次是反面,所以概率是0.5然後接著有m次的0.5概率,即總共是0.5的m+1次方。第二種情況的概率是:dp[i-(m+1)]*pow(0.5, m)

所以第三種情況的概率是他們兩個之和:dp[i-1]+dp[i-(m+1)]*pow(0.5, m)

下面是具體實現**:

整體思路很簡單:分析每個步驟中的概率,然後打表。以後會接著探索dp問題,這篇是dp問題的第一章。

動態規劃初步

基本原理 類似於遞迴解題,把問題丟給上一層來解決,找出狀態轉換方程即可。當然關鍵問題是如何定義遞迴陣列與找出狀態轉換方程。hello world 走樓梯 有n階樓梯,每次能走一步或兩步,請問有多少種走法。設f n 是n階樓梯不同的走法。則轉移到此狀態的方法有兩種,從n 1階樓梯走一步上來,或者從n ...

動態規劃初步

動態規劃的實質是通過多階段決策過程解決最優化問題,將每個問題分為若干個相互聯絡的階段,在它的每一階段都需要做出決策,這就是動態規劃與貪心演算法的區別,貪心演算法是以一種貪心規則進行最優運算,但往往得到的結果並不是問題的最優解,而動態規劃則不同,動態規劃是每一步都有乙個決策,保證了最優解是我們要找的整...

動態規劃初步

動態規劃的核心是狀態和狀態轉移方程。計算狀態轉移方程的方法 1 遞迴計算。用直接遞迴的方法計算狀態轉移方程,效率往往十分低下。其原因是相同的子問題被重複計算了多次。2 遞推計算。遞推的關鍵是邊界和計算順序。3 記憶化搜尋。不必事先確定各狀態的計算順序,但需要記錄每個狀態 是否已經計算過 動態規劃基礎...