動態規劃

動態規劃與貪心法的關系

基本歸納法:對于A_{i+1} ,只需要考察前一個狀態A_{i} 即可完成整個推理過程,它的特點是只要狀態A_{i} 確定,則計算A_{i+1} 時不需要考察更前序的狀態,我們將這一模型稱之為馬爾科夫模型

基本歸納法

高階歸納法:相應的,對于A_{i+1} ,需要考察前i個狀態集{{x_{1},x_{2},x_{3}......x_{i} }}才能完成整個推理過程,往往稱之為高階馬爾科夫模型

高階歸納法

在計算機算法中,高階馬爾科夫模型的推理,叫做“動態規劃”,而馬爾科夫模型的推理,對應“貪心法”。


最長遞增子序列LIS

? ? 給定長度為N的數組A,計算A的最長的單調遞增的子序列(不一定連續)

? ? 如:給定數組A{5,6,7,1,2,8},則A的LIS為{5,6,7,8},長度為4

? ? ? ? 長度為N的數組記為A={a_{0}, a_{1}, a_{2}...... a_{n-1}}

? ? ? ? 記A的前i個字符構成的前綴串為A_{i}=a_{0}, a_{1}, a_{2}...... a_{n-1} ,以a_{i} 結尾的最長遞增子序列記為L_{i} ,其長度為b[i];

? ? ? ? 假定已經計算得到了b[0,1,......,i-1],如何計算b[i]?

? ? ? ? ? ? 已知L_{0} L_{1} ......L_{i-1} 的前提下如何求L_{i}

? ? ? ? ? ? ? ? 根據定義,L_{i}必須以a_{i}結尾;

? ? ? ? ? ? ? ? 如果將a_{i}分別綴到L的后面,是否允許呢?

? ? ? ? ? ? ? ? ? ? 如果a_{i}\geq  a_{j} ,則可以將a_{i}綴到L_{j}后面,得到比L_{j}更長的字符串

? ? ? ? ? ? ? ? 從而:b[i]={max(b[j]+1,0<=j<i且a_{j}<=a_{i})}

? ? ? ? ? ? ? ? ? ? 計算b[i]:遍歷在i之前的所有位置j,找出滿足條件a_{j}\leq a{i}的最大的b[j]+1

? ? ? ? ? ? ? ? ? ? 計算得到b[0......n-1]后遍歷b[i],找出最大值即為最大遞增子序列的長度。

? ? 時間復雜度為O(n^2)


O(NlogN)的最長遞增子序列算法(貪心法)

? ? 對于數組A={1,4,5,2,8,9,7}

? ? 將A中的數字依次遍歷做壓棧操作,當遇到數組中的數字比棧中某個數字大,比某個數字小的情況下,進行替換操作,最后棧中數字個數即為最大遞增子序列的長度。

貪心法


? ? 股票最大收益

? ? ? ? 給定數組A[0......N-1],其中A[i]表示某股票第i天的價格。如果允許最多只進行一次交易(先買一次,再賣一次),請計算合適買賣達到最大收益,返回最大收益值。

? ? ? ? 如:[7,1,5,3,6,4],則最大收益為6-1=5

? ? ? ? 如:[7,6,4,3,1],則最大收益為0

? ? ? ? ? ? ? ? 一路下跌,則最好的方法是不進行交易。

解法


? ???????給定數組A[0......N-1],其中A[i]表示某股票第i天的價格。如果允許最多只進行K次交易(先買一次,再賣一次,算一次交易),請計算合適買賣達到最大收益,返回最大收益值。

? ? ? ? ? ? 規定買賣不能嵌套,及買入后要先賣出才可再買

? ? ? ? ? ? 如:A=[7,1,5,3,6,4],k=3,則在1,3處買入,5,6處賣出,最大收益為7

? ? ? ? ?分析:

? ? ? ? ? ? dp[k,i]表示最多k次交易在第i天的最大收益。

? ? ? ? ? ? 在第i天,有倆種選擇:要么賣出股票,要不賣出股票,從而得到狀態轉移方程。

狀態轉移方程
核心代碼

? ? ? ? ? ? 進一部分析

狀態轉移方程轉變

? ? ? ? ? ? ? ??

核心代碼



? ? 任務安排

? ? ? ? 給定一臺有m個存儲空間的單進程機器,現有n個請求:第i個請求計算時需要占用R[i]個空間,計算完成后,存儲計算結果需要占用O[i]個空間(其中O[i]<R[i])。問如何安排這n個請求的順序,使得所有請求都能完成。

? ? ? ? 如:m=14,n=2,R[1,2]=[10,8],o[1,2]=[5,6]??梢韵冗\行第一個任務,計算時占用10個空間,計算完成后占用5個空間,剩余9個空間執行第二個任務;單如果先運行第二個任務,則計算完成后僅剩余8個空間,第一個任務的計算空間就不夠了。

? ? ? ? 算法分析:

? ? ? ? ? ? 第K個任務的計算占用空間加上前面k-1個任務空間占用量之和,越小越好。從而:

算法分析

? ? ? ? ? ? 得:將按照R[i]-O[i]降序排列即可


? ? 操作最小次數

? ? ? ? 變量x從1開始變化,規則是:要么變成x+1,要么變成2*x,問:若想將x變成整數2015,最少需要多少次變化?

? ? ? ? 一種可行的操作變化:

? ? ? ? 1,2,3,6,7,14,15,30,31,62,124,125,250,251,502,503,1006,1007,2014,2015

? ? ? ? ? ? 如何思考:

? ? ? ? 任何一個數字都可以,如:20161006

? ? ? ? 1001100111010000111101110

二進制操作

? ? ? ? 設dp(n)表示從1到n的最少操作數

? ? ? ? ? ? 若n為奇數,則n的前一步只能是n-1

? ? ? ? ? ? 若n為偶數,則n的前一步是n-1和n/2的操作步數的小者

n是如何得到

? ? ? ? ? ? ? ??

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容