蒟蒻 樹形dp學習總結

2022-04-29 20:48:08 字數 1540 閱讀 3755

樹形dp,即基於樹的結構進行dp

一般來說樹形dp在設狀態轉移方程時都可以用f[i]表示i這顆子樹怎麼怎麼樣的最優解,實現時一般都是用子樹更新父親(即從下向上更新),那麼首先應該考慮的是乙個乙個子樹的更新父親還是把所有子樹都算完了在更新父親?這就要因題而異了,一般來說有兩種情況:1.需要把所有子樹的資訊都掌握之後再更新子樹的就需要把所有子樹都算完了在更新父親。2.而像樹上揹包這樣的問題就需要乙個乙個的更新,每次都用乙個子樹更新已經更新完的子樹+父親,最後就可以將這一部分的子樹更新完了,再繼續往上更新,最後根節點就是答案。

其實上面的兩種情況可以總結成一種情況就是乙個個子樹更新父親,一般來說第一種情況應用更多,也能解決第二情況的問題,只不過如果符合第二種情況的時候用第二種可以速度更快一點,畢竟你省了一遍迴圈嘛。

#include

#include

#include

#include

#include

using

namespace std;

vector<

int> son[

10010];

int dp[

10010][

2];//0不參加,1參加

int v[

10010];

//記錄有沒有父節點

int h[

10010];

//記錄快樂指數

int n;

void

dfs(

int x)

}int

main()

int root;

for(

int i =

1; i <= n; i++)if

(!v[i]

)dfs

(root)

; cout <<

max(dp[root][0

],dp[root][1

])<< endl;

return0;

}

老模板了

#include

using

namespace std;

#define maxn 6005

int h[maxn]

;int v[maxn]

;vector<

int> son[maxn]

;int f[maxn][2

];voiddp(

int x)

}int

main()

int root;

for(

int i=

1;i<=n;i++)if

(!v[i])dp

(root)

; cout<<

max(f[root][0

],f[root][1

])

}

蒟蒻 區間dp學習總結

例題 p1063 能量項鍊 p3205 hnoi2010 合唱隊 區間dp,顧名思義,在區間上dp,大多數題目的狀態都是由區間 類似於dp l r 這種形式 構成的,就是我們可以把大區間轉化成小區間來處理,然後對小區間處理後再回溯的求出大區間的值,主要的方法有兩種,記憶化搜尋和遞推。memset d...

蒟蒻 區間dp學習總結

例題 p1063 能量項鍊 p3205 hnoi2010 合唱隊 區間dp,顧名思義,在區間上dp,大多數題目的狀態都是由區間 類似於dp l r 這種形式 構成的,就是我們可以把大區間轉化成小區間來處理,然後對小區間處理後再回溯的求出大區間的值,主要的方法有兩種,記憶化搜尋和遞推。memset d...

蒟蒻 字典樹學習總結

又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。根節點不包含字元,除根節點外每乙個節點都只...