動態規劃與貪心法的關系
基本歸納法:對于,只需要考察前一個狀態
即可完成整個推理過程,它的特點是只要狀態
確定,則計算
時不需要考察更前序的狀態,我們將這一模型稱之為馬爾科夫模型
高階歸納法:相應的,對于,需要考察前i個狀態集{
}才能完成整個推理過程,往往稱之為高階馬爾科夫模型
在計算機算法中,高階馬爾科夫模型的推理,叫做“動態規劃”,而馬爾科夫模型的推理,對應“貪心法”。
最長遞增子序列LIS
? ? 給定長度為N的數組A,計算A的最長的單調遞增的子序列(不一定連續)
? ? 如:給定數組A{5,6,7,1,2,8},則A的LIS為{5,6,7,8},長度為4
? ? ? ? 長度為N的數組記為A={}
? ? ? ? 記A的前i個字符構成的前綴串為,以
結尾的最長遞增子序列記為
,其長度為b[i];
? ? ? ? 假定已經計算得到了b[0,1,......,i-1],如何計算b[i]?
? ? ? ? ? ? 已知的前提下如何求
? ? ? ? ? ? ? ? 根據定義,必須以
結尾;
? ? ? ? ? ? ? ? 如果將分別綴到
的后面,是否允許呢?
? ? ? ? ? ? ? ? ? ? 如果,則可以將
綴到
后面,得到比
更長的字符串
? ? ? ? ? ? ? ? 從而:
? ? ? ? ? ? ? ? ? ? 計算b[i]:遍歷在i之前的所有位置j,找出滿足條件的最大的
? ? ? ? ? ? ? ? ? ? 計算得到后遍歷b[i],找出最大值即為最大遞增子序列的長度。
? ? 時間復雜度為
的最長遞增子序列算法(貪心法)
? ? 對于數組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的操作步數的小者
? ? ? ? ? ? ? ??