筆記 題解 樹形DP lgP4084

2022-03-06 13:16:06 字數 870 閱讀 4902

一眼看過去是給定幾個限制求方案數,那麼肯定聯想到\(dp\),而且給出的是樹形結構,那麼就是一道樹形\(dp\)的題。

那麼先來總結一下樹形\(dp\)的一般規律,首先關於狀態轉移方程,一般是設\(dp[i][j]\)表示的是以\(i\)為根的子樹,有\(j\)或者更多的限制就用多維陣列。那麼如何求解呢?一般考慮兩種思路:\(1.\)先把所有的子樹都搜尋完再來更新父親節點的資訊\(\&\)答案。\(2.\)而如果是樹上揹包問題,則需要乙個乙個的更新。

這道題很容易得出狀態轉移方程:設\(dp[i][j]\)表示節點\(i\)塗第\(j\)種顏色的方案數,那麼轉移就從與它相連的顏色不同的點的\(dp\)值轉移而來,注意如果某乙個點已經被強制塗上了某種顏色,那麼它的\(dp\)陣列的值只有那一種顏色是\(1\),其他的都是\(0\),而對於沒有染色的點來說初始值都是\(1\)。

#include using namespace std;

struct nodeedge[100010 * 2];

int fir[100010],tot;

long long dp[100010][5];

const int mod = 1e9 + 7;

void add(int x,int y)

void dfs(int x,int fa)

dp[x][i] = 1;

} for(int i = fir[x];i;i = edge[i].next)

}int main()

for(int i = 1;i <= m;i++)

dfs(1,0);

cout<<(dp[1][1] + dp[1][2] + dp[1][3]) % mod

}

題解 hdu2196 樹形DP

題目鏈結 分析 求乙個樹中所有節點能到達的最遠距離f i 要用兩個dfs。首先第乙個dfs求出所有每個節點i在其子樹中的正向最大距離和正向次大距離和dist i 0 和dist i 1 如果i節點在子樹中最大距離經過了2號兒子,那麼次大距離就是不經過2號兒子的最大距離 並且還要標記longest i...

題解 poj1947 樹形DP

題目鏈結 dp root j 以root為根節點的子樹,得到 j 個節點的子樹需要最少減掉的邊數,注意子樹中必須保留root節點。否則無法dp 那麼很明顯的邊界條件dp root 1 num 兒子的個數 因為要只剩乙個節點的子樹,那麼所有的孩子都減掉,這樣就為兒子的個數。那麼狀態轉移方程呢 dp r...

樹形 DP 筆記 一

有 n 個物品,編號分別為 1 ldots n 物品 i 的重量為 w i 價值為 v i 給出每個物品依賴於哪個物品。我們用 d i j i j 0 表示 如果要選取物品 i 就必須先選取物品 j 另外,我們用 d i 0 i 0 表示 該物品不依賴於任何物品。揹包最多能裝載的重量為 w 請問揹包...