動態規劃類題目是校招筆試中經常出現的一類題目,因此在準備期間,總結一下解題的經驗,方便更好地應對動態規劃的題目;
找到子問題,用某個表示式描述子問題的狀態,一般為dp[i]
類似的表示式
根據可見的經驗,寫出狀態之間的轉移方程;
根據狀態方程,寫出求解**
下面以longest increasing subsequence這個題目為例來說明其中的解法
given an unsorted array of integers, find the length of longest increasing subsequence.
for example,
given [10, 9, 2, 5, 3, 7, 101, 18],
the longest increasing subsequence is [2, 3, 7, 101], therefore the length is 4. note that there may be more than one lis combination, it is only necessary for you to return the length.
your algorithm should run in o(n2) complexity.
follow up: could you improve it to o(n log n) time complexity?
第一步,解讀這個題目,找到這個問題要求解的子問題; 這道題我們以dp[i]
表示以第i個元素結尾的最長子序列,那麼這道題就變成了求解dp[1..n]
中的最大值;
第二步:根據經驗,找到狀態轉移方程:
dp[i] = max(dp[j] + 1, dp[i]) when nums[i] > nums[j] and j is from 1 to i - 1;
第三步:則是根據上述的方程寫出**進行求解:
int lengthoflis(vector
& nums)
maxlen = max(maxlen, dp[i]);
}return maxlen;
}
求解動態規劃的流程大概是這樣的流程。但困難的是:
下一次,將通過總結常見動規題的解法來反推常見動規題該如何建模,如何寫狀態轉移方程
一般來說,動態規劃題目一般都是遞迴問題,當我們找不到動態規劃的轉移關係的時候,可以退一步嘗試用遞迴的方法求解; 遞迴的方法往往非常暴力和直接,但針對校招筆試和面試中的題目比較有用吧。
對於動態規劃類,當你想到用遞迴方法做的時候,時間複雜度往往是指數複雜度,這樣一般都不能滿足筆試和面試題的要求;
這個時候,你需要想想遞迴中,為什麼會有那麼高的複雜度? 一般來說,往往是因為計算重複的子問題,這個時候嘗試地去把這些重複子問題的解儲存下來,當下次在求解相同問題的時候,直接返回就可以大大減少時間複雜度。
一維動態規劃總結
給乙個n 輸入 求某種情況的最大值或者最小值情況,279.perfect squares 最差情況下,總體是定義乙個dp n 1 或者初始化前面dp 0 或者dp 1 279.perfect squares given a positive integer n,find the least numb...
動態規劃總結
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 12 7 近期學了幾個動態規劃正好總結一下。裡面不涉及具體問題的具體解法,有問題可以參看我的具體型別的講解部落格。目前所見動態規劃可以劃分為兩類 鏈式和樹形。而且這兩類中的每個節點都是乙個完整的狀態集合。一 鏈式動態規劃 鏈式動態規劃的題...
動態規劃 總結
動態規劃是解決多階段決策問題的一種方法。如果一類問題的求解過程可以分為若干個互相聯絡的階段,在每乙個階段都需作出決策,並影響到下乙個階段的決策,從而確定了乙個過程的活動路線,則稱它為多階段決策問題。思想 在做每一步決策時,列出各種可能的區域性,解依據某種判定條件,捨棄那些肯定不能得到最優解的區域性解...