樹形dp初次學習

2021-08-26 05:53:34 字數 1327 閱讀 5515

1、什麼是樹型動態規劃

顧名思義,樹型動態規劃就是在「樹」的資料結構上的動態規劃,平時作的動態規劃都是線性的或者是建立在圖上的,線性的動態規劃有二種方向既向前和向後,相應的線性的動態規劃有二種方法既順推與逆推,而樹型動態規劃是建立在樹上的,所以也相應的有二個方向:

1、葉->根:在回溯的時候從葉子節點往上更新資訊

2、根 - >葉:往往是在從葉往根dfs一遍之後(相當於預處理),再重新往下獲取最後的答案。

不管是 從葉->根 還是 從 根 - >葉,兩者都是根據需要採用,沒有好壞高低之分。

2、樹形dp的理解

dp的關鍵就在於狀態的定義以及找轉移

首先要考慮清楚狀態,狀態要能夠很好地並且完整地描述子問題

其次考慮最底層的狀態,這些狀態一般是最簡單的情況或者是邊界情況

再就是考慮某乙個狀態能從哪些子狀態轉移過來,同時還要考慮轉移的順序,確保子問題已經解決

樹形dp很多時候就是通過子節點推父親節點的狀態

3、題目解析

poj2342

一棵樹,每個節點有權值,兒子與父親不能同時取,求解從樹上選取點能獲得的最大權值

dp[i][0]表示不取,dp[i][1]表示取。

設j為i的兒子節點,dp[i][0] += max(dp[j][0], dp[j][1]), dp[i][1] += dp[j][0];

入度為零的點是根,從根開始進行深搜。

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int inf = 0x3f3f3f3f;

const

int n = 6 * 1e3 + 5;

int dp[n][2];

vector

ve[n];

int in[n];

void dfs(int u)

}int main()

int u,v;

while(~scanf("%d %d",&u,&v))

int root;

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

}dfs(root);

int max = -1;

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

printf("%d\n",max);

}return

0;}

樹形dp學習

練習專題參考 傳送門 hdu 1520 題意 給出n個點,然後給出n個點對應的歡樂值,然後給出n 1條邊,a b,表示b是a的直屬上級,現在舉行乙個patry,但是要求員工和他的直屬上級不能同時來,問來的人的歡樂值的最大和是多少 思路 首先明確這是一棵有向樹,dp i 0 1 代表第i個人來 不來的...

樹形dp學習

學習部落格 樹的性質 n個點,n 1條邊,任意兩個點之間只存在一條路徑,可以人為設定根節點,對於任意乙個節點只存在至多乙個父節點,其餘為子節點。記憶化樹形dp模型較為抽象難以理解,以下通過由淺到深的方式解析樹形dp以及樹的性質。樹形dp求樹的直徑 在一顆樹里找到點x,y,使得 xy 最大 如圖,我們...

樹形DP學習總結

概述 樹形dp是dp的一種,有時候會和區間dp結合。由於樹有著天然的遞迴結構 父子結構 而且它作為一種特殊的圖 可以描述許多複雜的資訊 因此在樹就成了一種很適合dp的框架 問題 給你一棵樹 要求用最少的代價 最大的收益 完成給定的操作 樹形dp 一般來說都是從葉子從而推出根 當然 從根推葉子的情況也...