动态规划再理解(53、121、174)
本次文檔也是對動態(tài)規(guī)劃的 再認識 。
之前寫過一些文章,在處理動態(tài)規(guī)劃問題的時候依據(jù)的思路是 :暴力搜索->加緩存->動態(tài)規(guī)劃。相關(guān)文章有:算法八——動態(tài)規(guī)劃,動態(tài)規(guī)劃——0-1背包問題,動態(tài)規(guī)劃——矩陣中的最短路徑長度等等。
最近在看問題的時候發(fā)現(xiàn),只要能明白暴力搜索是怎么搜索的,跟哪些條件有關(guān)系,不經(jīng)過前面2個步驟也能寫出動態(tài)規(guī)劃方程。大家知道動態(tài)規(guī)劃方程出來了,基本上問題就解決了。寫下文章記錄一下 。
如果看不出和哪些條件有關(guān)系,或者找不到動態(tài)轉(zhuǎn)換關(guān)系,還是要依據(jù)步驟一步一步來。
1 53. Maximum Subarray
輸入:int數(shù)組,有正有負
輸出:找到所有子數(shù)組的和,返回其中最大的。
規(guī)則:子數(shù)組是一個連續(xù)的數(shù)組,至少包含一個元素。
例如:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
分析:對于任意一個元素nums[i],可以開啟一個子序列{nums[i]},也可以追加在前一個數(shù)字子序列的后面{…nums[i-1],nums[i]}。
對于開啟一個子序列的情況 ,子數(shù)組和=nums[i]。
對于追加的情況:目標是要求子數(shù)組和,所以只要之前以nums[i-1]為結(jié)尾的子數(shù)組的和+nums[i]即可。假設dp[i]=以nums[i]為結(jié)尾的子數(shù)組的最大的和。
最后結(jié)果在所有dp元素中查找最大值。
dp[i] = Math.max(nums[i],nums[i+dp[i-1]])
動歸特征:與前一個元素相關(guān);與以前一個元素為結(jié)尾的子數(shù)組最大和相關(guān)。
之后就是寫代碼了。
進一步空間優(yōu)化,可以自己思考。
2 121. Best Time to Buy and Sell Stock
輸入:int數(shù)組,表示每天的股價。
輸出:最大的盈利
規(guī)則:只可以買一次,賣一次。只能先買后賣。
例子:
Input: [7,1,5,3,6,4]
Output: 5
Explanation: 在價格為1的時候買入,在價格為6的時候賣出。
分析:只能買賣一次,先買后賣,說明是要找max(price[j]?price[i]),j>imax(price[j]-price[i]),j>imax(price[j]?price[i]),j>i。對于每一個j,只要找到min(price[i]),i=0,1...j?1min(price[i]),i=0,1...j-1min(price[i]),i=0,1...j?1即可。
總結(jié)
以上是生活随笔為你收集整理的动态规划再理解(53、121、174)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东支付功能流程
- 下一篇: JavaScript之apply()和c