時間限制:c/c++
1秒,其他語言2秒
空間限制:c/c++
131072k,其他語言262144k
64bit io format:
%lld
牛牛最近得到了一顆樹,根是 1 號節點,他想要把這顆樹染色。
每個節點可以染成白色和黑色,牛牛認為一種染色方案是好的當且僅當任意兩個黑點的 lca(最近公共祖先)的顏色也是黑色的。
求一共有多少種好的染色的方案。
輸入描述:
第一行乙個整數 n,表示這棵樹有 n個節點。 接下來 n-1行,每行兩個整數 u,v 表示 u,v之間有一條邊。輸出描述:
一行乙個整數,表示所有合法的點的集合數量。示例1
輸入
412
2324
輸出
14
說明
共計14個集合滿足題意。
注意:空集也算進答案裡面!
示例2輸入
612
1314
2556
輸出
42
備註:
1≤n≤10 6 ,1≤u,v≤n
乙個有n個節點的樹,(其中根節點是1),每個節點可以染色為黑與白,如果有兩個節點都是黑,他們的最近公共祖先也必須是黑,問有多少種塗色方案?
樹形dp問題
我們可以用dp[x][0/1]來表示樹上的節點x已經被染成黑色或者是白色的方案數(黑用1,白用0)
因為題目只對黑色有限制條件,所以如果x為黑色,x的子節點可以是黑色也可以是白色,但是如果x為白色,x的子節點只能是白色,或者是乙個黑色,因為如果有兩個黑色,x作為他倆的最近公共祖先也必須是黑色。
我們在處理時僅考慮染成黑色就行,因為黑色除外的都要染成白色。1是染成黑色,0為白色(也可以理解成不處理)
我們根據上述分析可以列出式子:
dp [x ] [ 0 ]= d p [ x] [ 0 ] + d p[ y ] [ 1 ]+ d p [ y ][ 0 ] - 1
x點不染色的情況是,x的子節點只能是白色,或者是乙個黑色(因為存在空集所以減一)
dp [x ] [ 1 ] = dp[ x] [ 1 ] * dp [y ] [1 ] +dp[ x] [ 1 ] * d p[ y ] [ 0 ]
x染為黑,x的子節點可以是黑色也可以是白色,種類數量相乘
最後推到根節點1
答案就是dp[1][1]+dp[1][0]
void
***(
int x,
int fa)
}printf
("%d"
,(dp[1]
[0]+dp[1]
[1])
%mod)
;
每日一題倒是出現了好幾個樹形dp的題 牛客練習賽62 C 牛牛染顏色(樹形dp)
題意 給出一棵樹,要將樹上的點染成白色或者黑色,有乙個限制條件,任意兩個黑色的點的lca的顏色也必須是黑色,求染色的方案數。題解 設dp i 表示以i為根節點的子樹的至少有乙個黑點的方案數,空集就是dp i 1 1.若點u為黑點,那麼子節點怎麼染色都可以,dp u dp v 1 2.若u為白色的點,...
牛牛的木板 牛牛的字元反轉
原題鏈結 題意 一段長n的序列,由0 1組成。可把m個0改1,求序列中最大連續1的個數。思路 尺取法 雙指標法 設定一對指標l,r。最開始都指向第乙個元素。l,r是區間左右端點,r指標先不斷往右遍歷,當區間內0的個數超過m時,l指標向右遍歷,要跳過乙個0,維持乙個區間內改了m個0的狀態 其間不斷用區...
染陌足跡 SeeConf2019
水文預警!多圖預警!聽了一整天,每位講師的演講都十分精彩,每個主題都能給我從另乙個角度的思考與啟迪,大部分主題都是以未來的互動設計作為維度來展開思考與 以故事或者事例的方式鋪展開來,收穫頗多。由於早上開始的時間市九點,於是起了乙個大早,好久沒那麼早起來過了。帶著滿滿的睏意踩點到了螞蟻z空間。z空間並...