樹形dp總結 從入門到放棄

2022-06-20 17:27:12 字數 1537 閱讀 7154

一、如何擁有一棵樹how to build a tree

存樹的方法有很多種,我個人常用的有:

鏈式前向星存圖法

因為樹也是一種圖,所以說對於存圖法是適用的。缺點就是不好利用樹的性質。

因為比較普遍,教程也很多,就不再贅述了。

左兒子右兄弟法

1

struct node //

結構體存樹

2a[n];//

這個好像叫tree更標準56

void findplace(int x,int y)//

x是根,y是要插入的兒子713

14int

main()

1520

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

2129 }

優點是可以非常方便地遍歷整個樹,缺點是有點慢。但是在作業系統內部,資料夾之間似乎也是這麼存放的呢。

遍歷的方法:

void printree(int

pos)

if(l!=-1

)//再考慮兒子

printree(l);

}

二、如何狀態轉移how to dp

樹上的dp一般狀態轉移都是和子樹相關的,而且第一維一般而言都是當前節點的標號。利用記憶化搜尋其實能更好利用樹,刷表填表我都不太適應……

普通dp比較常用的考慮方法是f[i][0/1]表示點i選/不選的情況下,其子樹的最優情況;

如果是樹形揹包,那麼f[i][j]表示在以點i為根節點的子樹中,選擇j個點的最優情況。

當然這個要視具體情況分析而定。

需要注意的是樹形揹包的轉移方程通常是各個子樹的份額分配問題,然後取max或者相加或者玄學操作。當這棵樹是二叉樹時可以簡單地使用單重迴圈,其他需要多重迴圈。這時候迴圈的邊界就變得重要了。通常可以考慮記錄size(子樹節點個數)、直接兒子個數什麼的或者其他的題目條件來優化邊界。

一般而言要考慮的問題:葉子節點(也就是邊界)、選擇和不選擇時對應的子節點情況(有什麼要求)、根節點怎麼處理等。如果沒有根節點,可以考慮構建乙個虛根;如果題目中是邊權,可以考慮下沉至點權來做。注意根節點是不是占用名額!這個是比較重要的。

三、如何水經驗how to get exp

luogu上p201x的題目很多都是樹形dp的。個人的成長路線是:

1.沒有上司的舞會(經典dp)

2.二叉蘋果樹(樹形揹包入門)

3.選課(樹上依賴揹包入門)

4.戰略遊戲(普通dp)

5.「訪問」美術館(有意思)

5.有線電視網(更有意思)

本蒟蒻比較菜,所以底線就到這裡啦。

kmp從入門到放棄

標籤 kmp 擴充套件kmp 給你兩個字串,你需要回答,b串是否是a串的子串 a串是否包含b串 a aaaaaaaaaaaaaaaaaaaaaaaaaab b aaaaaaaab 最壞狀態 o mn 一般做法 for 列舉b在a串中的起始位置 for 向後比較ab是否相等 o n m 傳說中的kmp...

beego 從入門到放棄

beego 的專案基本都是通過 bee命令來建立的,所以在建立專案之前確保你已經安裝了 bee 工具和 beego。如果你還沒有安裝,那麼請查閱 beego 的安裝 和 bee 工具的安裝 現在一切就緒我們就可以開始建立專案了,開啟終端,進入 gopath src 所在的目錄 建立乙個專案名為201...

Flutter從入門到放棄

本篇主要記錄下flutter的學習路線。一 認識flutter 可以檢視這些文章 二 dart語言 1 認識dart語言 2 學習 從2018.02開始出現dart2,屬於強型別語言。介紹位址參考 三 開始flutter 網上也有很多部落格介紹了flutter怎麼安裝,但大多介紹不全,第一次安裝難免...