動態規劃學習筆記

2021-10-03 18:28:33 字數 985 閱讀 8008

最近開始學習動態規劃演算法,我的理解是動態規劃演算法是乙個用空間換時間的演算法,常用在一些求最解、計數、判斷有無等問題中,且這些問題都存在大量重複的計算。

動態規劃的思想就是將已經計算過的資料儲存起來,在下次用到時可以直接取用,這樣就消除了重複計算。而且這也是體現「動態」的地方,就是能根據之前情況進行靈活處理。

這個問題的最後一步是什麼;

倒數第二步我會怎麼做;

我需要儲存什麼值;

怎樣利用這些已經儲存的;

比如,乙個典型的動態規劃的問題:有如下陣列,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,...