一眼看過去是給定幾個限制求方案數,那麼肯定聯想到\(dp\),而且給出的是樹形結構,那麼就是一道樹形\(dp\)的題。
那麼先來總結一下樹形\(dp\)的一般規律,首先關於狀態轉移方程,一般是設\(dp[i][j]\)表示的是以\(i\)為根的子樹,有\(j\)或者更多的限制就用多維陣列。那麼如何求解呢?一般考慮兩種思路:\(1.\)先把所有的子樹都搜尋完再來更新父親節點的資訊\(\&\)答案。\(2.\)而如果是樹上揹包問題,則需要乙個乙個的更新。
這道題很容易得出狀態轉移方程:設\(dp[i][j]\)表示節點\(i\)塗第\(j\)種顏色的方案數,那麼轉移就從與它相連的顏色不同的點的\(dp\)值轉移而來,注意如果某乙個點已經被強制塗上了某種顏色,那麼它的\(dp\)陣列的值只有那一種顏色是\(1\),其他的都是\(0\),而對於沒有染色的點來說初始值都是\(1\)。
#include using namespace std;
struct nodeedge[100010 * 2];
int fir[100010],tot;
long long dp[100010][5];
const int mod = 1e9 + 7;
void add(int x,int y)
void dfs(int x,int fa)
dp[x][i] = 1;
} for(int i = fir[x];i;i = edge[i].next)
}int main()
for(int i = 1;i <= m;i++)
dfs(1,0);
cout<<(dp[1][1] + dp[1][2] + dp[1][3]) % mod
}
題解 hdu2196 樹形DP
題目鏈結 分析 求乙個樹中所有節點能到達的最遠距離f i 要用兩個dfs。首先第乙個dfs求出所有每個節點i在其子樹中的正向最大距離和正向次大距離和dist i 0 和dist i 1 如果i節點在子樹中最大距離經過了2號兒子,那麼次大距離就是不經過2號兒子的最大距離 並且還要標記longest i...
題解 poj1947 樹形DP
題目鏈結 dp root j 以root為根節點的子樹,得到 j 個節點的子樹需要最少減掉的邊數,注意子樹中必須保留root節點。否則無法dp 那麼很明顯的邊界條件dp root 1 num 兒子的個數 因為要只剩乙個節點的子樹,那麼所有的孩子都減掉,這樣就為兒子的個數。那麼狀態轉移方程呢 dp r...
樹形 DP 筆記 一
有 n 個物品,編號分別為 1 ldots n 物品 i 的重量為 w i 價值為 v i 給出每個物品依賴於哪個物品。我們用 d i j i j 0 表示 如果要選取物品 i 就必須先選取物品 j 另外,我們用 d i 0 i 0 表示 該物品不依賴於任何物品。揹包最多能裝載的重量為 w 請問揹包...