Codeforces|Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】
题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数
解法:树形DP问题。定义:
dp[u][0]表示以u为根的子树对父亲的贡献为0
dp[u][1]表示以u为根的子树对父亲的贡献为1
现在假设u为白色,它的子树有x,y,z,那么有
dp[u][1]+=dp[x][1]*dp[y][0]*dp[z][0]+dp[x][0]*dp[y][1]*dp[z][0]+dp[x][0]*dp[y][0]*dp[z][1]
dp[u][0]+=dp[x][0]*dp[y][0]*dp[z][0]
然后判断u的颜色,假设u的父亲为p
1.为黑色,不切断边(u,p),那么dp[u][1]=dp[u][0],切断(u,p),那么dp[u][0]不变
2.为白色,如果切断(u,p),dp[u][0]还要加上dp[u][1]
代码:
文章图片
文章图片
#include#include #include #include #include #include #include #include #include #define Mod 1000000007 #define lll __int64 using namespace std; #define N 100007vector G[N]; lll dp[N][2]; int col[N]; void dfs(int u,int fa) { dp[u][0] = 1LL; dp[u][1] = 0LL; for(int i=0; i
View Code
【Codeforces|Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】】转载于:https://www.cnblogs.com/whatbeg/p/3941805.html
推荐阅读
- RxSwift官方playground翻译
- 儿童学编程语言swift语言|儿童学编程语言swift语言 playgrounds12 嵌套模式
- 前端知识设置元素的背景
- codeforces B. Young Explorers
- codeforces C. Mere Array
- codeforces D. Omkar and Bed Wars
- codeforces C. Omkar and Waterslide
- codeforces B. Omkar and Infinity Clock
- codeforces B. Ternary Sequence
- Codeforces580|Codeforces580 D. Kefa and Dishes(状压dp)