型別
一、多叉樹轉二叉樹進行資源分配
例如:* 例1. 選課:每門課可能有一門先選課,即某些課必須在另外的某節課被選之後才能選,每門課能得的學分不同,求最大學分。
* 例2. 通向自由的鑰匙:可以從乙個房間通向另外多個房間,通過每個房間所需的花費不同,得到的價值也不同,用最小花費獲得最大價值。
這種題目的特點是需要在多叉樹上進行資源的分配,對不同的子樹分配不同的資源,以求最大價值。可以直接在多叉樹上用揹包的方式求解,但是更常用的方法是用左孩子右兄弟表示法轉化為二叉樹。
轉化之後的通用狀態轉移方程:
用 f(i,j) 表示將總量為 j 的資源分配給以 i 為根節點的子樹,則
f(i, j) = max,其中 k∈(0, j-cost(i))
解釋一下上面的方程。對於每個節點 i 都有兩種決策:
1. 在節點 i 消耗資源並獲得相應價值,然後在節點 i 的子節點和兄弟節點中進行決策;
2. 忽略節點 i ,在 i 的兄弟節點(i.right)中進行決策。
以上兩道例題的狀態轉移方程寫法都與這種通用寫法類似。
型別二、乙個節點的不同狀態
(這種型別不知道怎麼叫)
例如:* 例1. 警衛安排:在乙個節點上安排警衛可以保證與其相鄰的節點的安全,每個節點安排警衛的代價不同,在一棵樹上用最小代價保證整棵樹的安全。
* 例2. 沒有上司的晚會:職員和他的直接上司不會同時出現在晚會,每個職員在晚會上的快樂程度不同,求晚會的最大快樂程度。
這種題目的特點是每個節點有各自不同的狀態,如警衛安排中每個節點有三種狀態:1. 自己設有警衛;2. 父節點設有警衛;3. 子節點設有警衛。例2中每個節點(職員)有兩種狀態:1. 參加;2. 不參加。
對每個節點的每個狀態進行轉移即可。
如例2:
用 f(i, 0) 表示 i 不參加晚會,用 f(i, 1) 表示 i 參加晚會,則
f(i, 0) = sum }
f(i, 1) = sum }
(j 是 i 的子節點)
解釋一下上面的兩個方程:
當 i 參加晚會時,i 的下屬必然不參加晚會;
當 i 不參加晚會時,i 的下屬可以參加晚會也可以不參加晚會。
例1類似。
型別三、二叉樹上的資源分配
是型別一的簡化版,題目的模型即二叉樹,不用進行轉換就可以直接求解。
樹型動態規劃 巡邏
問題描述 在乙個地區中有 n個村莊,編號為1,2,n。有n 1條道路連線著這些村 莊,每條道路剛好連線兩個村莊,從任何乙個村莊,都可以通過這些道路到達其 他任乙個村莊。每條道路的長度均為 1個單位。為保證該地區的安全,巡警車每天要到所有的道路上巡邏。警察局設在編號 為1的村莊裡,每天巡警車總是從警察...
區間型動態規劃總結
區間型動態規劃,都是dp i j 由小的區間先計算,然後計算大的區間得到,模板就是 for int len 2 len n len int n s.length int dp new int n n int maxlen 0 for int i 0 i n i char ss s.tochararr...
動態規劃練習
題目描述 給出兩個單詞word1和word2,計算出將word1 轉換為word2的最少操作次數。你總共三種操作方法 插入乙個字元 刪除乙個字元 替換乙個字元 include include include using namespace std int find min int x,int y,i...