一、如何擁有一棵樹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二、如何狀態轉移how to dppos)
if(l!=-1
)//再考慮兒子
printree(l);
}
樹上的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怎麼安裝,但大多介紹不全,第一次安裝難免...