1. 程式人生 > 實用技巧 >Python案例|動態規劃應該怎麼做

Python案例|動態規劃應該怎麼做

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

以下文章來源於騰訊雲 作者:演算法與程式設計之美

( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )

動態規劃原理

動態規劃演算法將待求解問題拆分成一系列相互交疊的子問題,通過遞推關係定義各子問題的求解策略,並隨時記錄子問題的解,最終獲得原始問題的解,避免了對交疊子問題的重複求解。

動態規劃要領

在動態規劃演算法中有三要素,即最優子結構、邊界和狀態轉移函式。
最優子結構:每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到;
邊界:問題最小子集的解;
狀態轉移函式:從一個階段向另一個階段過渡的具體模式,描述的是兩個相鄰子問題之間的關係。

最長上升子序列問題

給定一個無序的整數陣列,找到其中最長上升子序列的長度。

1.示例
輸入: [10,9,2,5,3,7,101,18]

輸出: 4

解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4。

2.解題思路:

狀態定義:
建立與輸入列表nums相同長度的列表dp,dp[i]的值代表nums前i個數字的最長子序列長度。

3.最優子結構:

當計算dp[i]時,我們需要遍歷[0,i)的列表區間做出判斷(j∈[0,i)):
(1)當nums[i]>nums[j]時,此時為上升子序列,所以此時dp[i]=dp[j]+1
(2)當nums[i]>nums[j]時,此時不是上升子序列跳過

4.轉移方程:dp[i]=max(dp[i],dp[j]+1)
5.初始狀態:每個元素至少可以單獨成為子序列,所有dp列表所有元素初始值為1
class  Solution:    def lengthOfLIS(self, nums) :        len_nums=len(nums)        dp=[1 for i in range(len_nums)]         for i in range(1,len_nums):            for j in range(i):                if nums[i]>nums[j]:                    dp[i]=max(dp[i],dp[j]+1)        return
max(dp)

總結

以上就是本篇文章全部內容,才開始學習動態規劃的萌新沒看懂不要著急,動態規劃的程式碼是有跡可循的,需要大家多多練習類似的題目。對於大家來說這道題還有另外的解法,希望各位讀者們多多交流,將你們的程式碼發表在留言區供大家參考。