博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF461B Appleman and Tree
阅读量:5262 次
发布时间:2019-06-14

本文共 1407 字,大约阅读时间需要 4 分钟。

CF461B Appleman and Tree

一道比较容易的树形DP。

考虑用\(dp[i][1]\)代表将\(i\)分配给\(i\)的子树内黑点的方案数,\(dp[i][0]\)代表将\(i\)分配给\(i\)的子树之外的黑点的方案数。

首先,考虑分给\(i\)的子树黑点的情况:\(dp[i][1]=\sum _{p\in son_i} dp[p][0]\prod _{t\in son_i,t\neq p} (dp[t][1]+dp[t][0])\)

再考虑分给其他子树的情况:\(dp[i][0]=\prod _{t\in son_i}(dp[t][0]+dp[t][1])\)

特别的,当这个点是黑点时,\(dp[i][0]=0,dp[i][1]=\prod_{t\in son_i} (dp[t][1]+dp[t][0])\)

初始化一个点最深的点时,如果点为白点\(dp[i][0]=1,dp[i][1]=0\),否则\(dp[i][0]=0,dp[i][1]=1\)

#include
#include
#include
#include
#include
#define ll long long#define mod 1000000007#define maxn (int)(1e5+100)using namespace std;ll dp[maxn][2],n;ll pre[maxn],suc[maxn];vector
side[maxn];bool col[maxn];int cnt,list[maxn];void dfs(int now,int fa) { if(side[now].size()==1&&fa!=0) { if(col[now])dp[now][0]=0,dp[now][1]=1; else dp[now][0]=1,dp[now][1]=0; return; } dp[now][0]=1,dp[now][1]=0,pre[0]=1; for(int i=0;i
=1;i--) {suc[i]=suc[i+1]*(dp[list[i]][0]+dp[list[i]][1]);suc[i]%=mod;} for(int i=1;i<=cnt;i++) { dp[now][1]+=dp[list[i]][1]*((pre[i-1]*suc[i+1])%mod);dp[now][1]%=mod; } return;}int main() { ios::sync_with_stdio(0); cin>>n; for(int i=2;i<=n;i++) { int u;cin>>u;u++;side[i].push_back(u);side[u].push_back(i); } for(int i=1;i<=n;i++)cin>>col[i]; dfs(1,0); cout<

1669439-20190819192558226-1497421538.jpg

转载于:https://www.cnblogs.com/GavinZheng/p/11379079.html

你可能感兴趣的文章
go 文件上传
查看>>
axure学习点
查看>>
javascript: 处理URL字符串
查看>>
MATLAB数值计算与数据分析(2)
查看>>
JUnit
查看>>
WPF文本框只允许输入数字[转]
查看>>
事务的四种隔离级别和七种传播行为
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
Denver Broncos nfl jersey authentic considering alot more
查看>>
HDU 3572 最大流
查看>>
Bootstrap基础
查看>>
Javascript: 从prototype漫谈到继承(1)
查看>>
POJ 3974 Palindrome | 马拉车模板
查看>>
oracle表关联update和表建立索引
查看>>
JVM运行内存分类
查看>>
【学习】博弈相关:Nim
查看>>
BZOJ4552 HEOI/TJOI2016 排序 线段树、二分答案
查看>>
13. 用Roberts、Sobel、Prewitt和Laplace算子对一幅灰度图像进行边缘检测。观察异同。...
查看>>
Web 安全入门-书籍及建议
查看>>
prim算法基础详解(无向赋权图的最小生成树MST)
查看>>