動態規劃與排列組合二項式的關係

前言:最近做各大廠的筆試題,發現動態規劃和排列組合的題挺多的,於是認真研究了一下,寫在這裏備忘。

1.先拋出數學上的公式

當a=b=1的時候,該二項式變成了,這就是二進制下的遞推關係了。

雖然二項式有很多特性,但是在計算機中我們只關注兩個特徵:即遞推關係和邊界條件,對應着兩個公式:

也就是動態規劃的狀態方程和初始狀態,如上圖所示的兩個關係,這樣看着很抽象,那麼先看如下圖的推導:

通過二項式與楊輝三角型的對比可以出它們是一一對應的,由此也就得出了這個重要的遞推關係:

它表示任意時刻 ( 第k個時刻,k是介於[0-n]之間任意的值) 的中間狀態,都是可以由上以時刻的值遞推出來的,這是二項式與楊輝三角型直觀對應得出的公式,當然也可以通過數學證明(太麻煩省略)。

         因爲計算機的變量在某一個時刻只能存一個值,這個值可以由之前的變量推出來,因此建立了依賴關係,用遞推關係來求解問題就可以保證在多項式時間複雜度內完成,比暴力搜索要快。同時爲了避免重複計算先前的結果,因此使用一個二維表(矩陣)來緩存結果。那麼按照楊輝三角型的特點,相鄰兩個子結果,也就是矩陣的元素(表示子結果的狀態),是按照上述關係依賴的。

動態規劃中通常是從結果向開始逆向遞推,結束條件就是另外一個公式:

因此排列組合公式:就可以用動態規劃的方式推出來。

所以動態規劃三個主要步驟:1.抽象出當前的狀態;2.確定遞推關係(也就是狀態方程);3.確定初始條件(邊界)。

1.當前狀態即:i表示什麼,j表示什麼,dp[i][j]表示什麼

2.遞推關係即:這是一個模版公式,對於不同的題目/場景會不同,核心思想是找到如果有上一個結果推出當前的結果,以楊輝三角形爲例,當前值應該其上一行的當前列k 和當前列的左邊一列k-1之和。對於01揹包問題,當前物品爲i,如果不選它,則是m[i-1][j],如果選了它則是m[i-1][j-w[i]]+vi,選和不選的兩個值則是有上一個狀態的兩個相鄰結果推出來的。01揹包問題見下圖。

3.初始條件即:,初始時的狀態,通常要手動賦值,也就是矩陣dp[n+1][m+1]的第一行和第一列。

代碼:

同樣地,對於某筆試題: 小Q歌單、合唱團(自行百度題目), 都可以按照的思想快速確立狀態方程。

小Q歌單:就是以楊輝三角形來存所有的組合項:

合唱團:從n個元素中選擇k個,使這k個元素的乘積最大
     有 n 個學生站成一排,每個學生有一個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,
     要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,求最大的乘積?

先這樣把,後面再整理。

突然覺得數學和計算機息息相關啊,後悔當初數學沒學好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章