動態規劃經典入門級題目 2及詳解

2021-08-08 17:46:05 字數 1187 閱讀 4515

一句話解釋動態規劃:多階段最優化決策解決問題的過程

解題技巧:只關注狀態轉移(子問題之間的關係),不要考慮某個狀態是怎麼出現的

乙個只包含大寫字母的字串加密後變成了只包含數字的字串,加密的規則:

'a' -> 1

'b' -> 2

...'z' -> 26

現在給定乙個只包含數字的加密過的字串,求該字串有多少種解密的方法。例如「12」->"ab", "12"->"l"

解:2位的在26以內的相鄰的數可以產生不同的解,字串用str表示,用一維陣列dp[i]來表示從0到i位解碼方法總數,dp[0]=1,想從dp[i]得到dp[i+1]:

1.str[i+1]是『0』,那麼他不能單獨譯成乙個字母,一定是和str[i]組合,dp[i+1] = dp[i-1]

2.str[i+1]不是『0』:  

1)str[i]和str[i+1]位不能組成乙個字母,將str[i+1]解碼為對應的字母,dp[i+1] = dp[i]

2)str[i]和str[i+1]可以組和譯成乙個字母,則在這裡就可以出現2種解碼方法,如果單獨譯dp[i+1],有dp[i]種方法,如果組合起來,有dp[i-1]種方法,那麼dp[i+1] = dp[i]+dp[i-1]

**:

int decode_num(string& str) 

return dp[len-1];

}

給定乙個整數陣列,求乘積最大的子陣列的乘積值

解: 1)首先明確陣列中的數可能是負數

2)設陣列是vec,這裡我們在for迴圈中用乙個max和min值分別記錄包含0~i中包含vec[i]的子陣列的乘積的最大值和最小值,為什麼一定是包含vec[i]呢,因為只有在這個定義之下,我們才能由i計算到i+1

3)那麼包含vec[i]的子陣列乘積的最大值就是vec[i],vec[i]*max,vec[i]*min中的最大值(當min和vec[i]同為負,相乘得到最大值),更新max值

4)迴圈中同時更新min,min就是vec[i],vec[i]*max,vec[i]*min中的最小值

5)返回的結果max_product,是以0~size-1結尾的子陣列乘積最大值的最大值

**:

int max_product(vector& vec) 

return max_product;

}

入門級動態規劃 傳紙條

題目簡述 班上同學被安排做成乙個m 行nn 列的矩陣,安排在矩陣對角線的兩端的兩名同學想要通過傳紙條聯絡,紙條要經由許多同學傳到對方手裡,一名同學坐在矩陣的左上角,座標 1,1 1,1 另一名同學坐在矩陣的右下角,座標 m,n m,n 從第一名同學傳到第二名同學的紙條只可以向下或者向右傳遞,反之則只...

動態規劃 經典題目

made by syx time 2010年7月17日 13 58 47 矩陣連乘 最長公共子串行 最長公共子串行 include char x 8 char y 7 int b 9 8 int c 9 8 void printarray int i1,int j1,int i2,int j2,in...

動態規劃經典題目整理

複雜度 o n w o nw o nw n nn為物品種類,w ww是揹包的重量 目的 使得揹包中的物品價值最大化 單副本揹包問題 每種物品只有一件 k w j ma xk w,j max k w,j max k w j k w,j k w,j 代表揹包重量為w ww,有j jj件物品時候的最大價值...