樹型動態規劃練習總結

2022-05-18 12:42:08 字數 1173 閱讀 1331

型別

一、多叉樹轉二叉樹進行資源分配

例如:* 例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...