最近開始學習動態規劃演算法,我的理解是動態規劃演算法是乙個用空間換時間的演算法,常用在一些求最解、計數、判斷有無等問題中,且這些問題都存在大量重複的計算。
動態規劃的思想就是將已經計算過的資料儲存起來,在下次用到時可以直接取用,這樣就消除了重複計算。而且這也是體現「動態」的地方,就是能根據之前情況進行靈活處理。
這個問題的最後一步是什麼;
倒數第二步我會怎麼做;
我需要儲存什麼值;
怎樣利用這些已經儲存的;
比如,乙個典型的動態規劃的問題:有如下陣列,a:[3,-1,2,5,-7,9],求其中連續的子區間和的最大值。
按照上述的問題,我先思考最後一步我會怎麼計算。因為是連續的子區間,所以我會先找這個連續子區間的最後乙個元素i,因為這個子區間的最大長度不可能超過 i 。所以,我最後一步會研究f(5),表示以a(5)為最後乙個元素的子區間中各元素和的最大值。
接下來我會研究第二步,因為是連續子區間,所以我再會比較:f(4)+a[5] 和 f(4) 的大小,大的作為f(5)的值,即:
f(5) = max(f(4),f(4)+a[5]);
所以我們需要開乙個陣列s[5],儲存每個元素結尾的子區間的最大值;
如何利用已經儲存的值?看上面的式子:f(5) = max(f(4),f(4)+a[5]) ,可以得到狀態轉換方程:
f(i) = max (f(i-1)+a[i],f(4)).
所以可以得到如下**:
go 語言實現
func maxsubarray(nums int) int
res = int(math.max(float64(nums[i]),float64(res)))
}return res
}
習題集(來自leetcode):
leetcode-----53. 最大子序和
leetcode-----1013. 將陣列分成和相等的三個部分
leetcode------198. 打家劫舍
學習筆記 動態規劃
動態規劃 多階段決策 意義 求解決策過程最優化的數學方法 基本思想 將待求解的問題分為若干個階段,即若干個互相聯絡的子問題,在求解子問題的過程中逐步推導出原問題的解。核心 在求解子問題的過程中,儲存子問題的解。注1 動態規劃的思想實際上和遞迴相似。都是通過逐步推導,得到答案。而用它們解題時的核心也都...
學習筆記 動態規劃
bullet 先來看乙個問題 小張現在有8個任務可選,每個任務都必須在規定的時間段完成不能多也不能少,而且每個任務都有對應的報酬如下圖,問小張應如何選擇才能拿到最多的報酬?那我們換種方法來解決這個問題吧,首先,每個任務都有選和不選兩種選擇,我們從最後乙個任務開始模擬這個過程。首先我們需要先用乙個陣列...
動態規劃學習筆記
案例1 最長回文序列 乙個字串有許多子串行,比如字串abcfgbda,它的子串行有a bfg bfgbd,在這些子串行中肯定有回文字串。現在要對任意 字串求其最長的回文子串行。注意,本文不是解決最長回文子串,回文子串是連續的,回文子串行是不連續的。字串abcfgbda 的最長回文子串行為abcba,...