题目链接:http://codeforces.com/problemset/problem/461/B

题意:

  给你一棵树(编号从0到n-1,0为根节点),每个节点有黑白两种颜色,其中黑色节点有k+1个。

  现在让你删掉k条边,使得这棵树变成k+1个连通块,并且要保证每个连通块中有且仅有一个黑色节点。

  问你删边的方案有多少种。

题解:

  表示状态:

    dp[i][0/1] = numbers

    表示在节点i所在的连通块中有(1)或没有(0)黑色节点时,节点i的子树的删边方法数

    因为总要保证每个连通块中有且仅有一个黑点,所以最后一定删了恰好k条边,并不用记录当前删了多少边。

  找出答案:

    ans = dp[0][1]

    最终根所在连通块中一定有且仅有一个黑点。

  如何转移:

    将删边的过程反过来考虑。

    将节点i连向它的儿子的边一条条删去,相当于:

      i本身没有儿子,然后将一棵棵子树添加为它的儿子,同时保证合法。

    那么最终的方案取决于三个条件:

      (1)i所在的连通块(简称块i)是否有黑点

      (2)son所在的连通块(简称块son)是否有黑点

      (3)是否删去边(i,son)

    分情况讨论:

      (1)块i有黑点

        a. 块son有黑点,此时只能将边删去,最终的块i有黑点

        b. 块son全是白,此时只能保留这条边,最终的块i有黑点

      (2)i是白色

        a. 块son有黑点,此时删边或不删都可以:

          I. 删边,最终的块i全是白

          II. 不删,最终的块i有黑点

        b. 块son全是白,此时只能保留这条边,最终的块i全是白

    综上:

      dp[now][1] = dp[son][0]*dp[now][1] + dp[son][1]*(dp[now][1]+dp[now][0])

      dp[now][0] = (dp[son][0]+dp[son][1])*dp[now][0]

  边界条件:

    dp[i][c[i]]=1

AC Code:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 100005
#define MOD 1000000007 using namespace std; int n;
int c[MAX_N];
long long dp[MAX_N][];
vector<int> edge[MAX_N]; void read()
{
cin>>n;
int x;
for(int i=;i<n;i++)
{
cin>>x;
edge[x].push_back(i);
}
for(int i=;i<n;i++)
{
cin>>c[i];
}
} void dfs(int now)
{
dp[now][c[now]]=;
for(int i=;i<edge[now].size();i++)
{
int temp=edge[now][i];
dfs(temp);
long long blk=dp[now][];
long long wht=dp[now][];
dp[now][]=(dp[temp][]*blk+dp[temp][]*(blk+wht))%MOD;
dp[now][]=(dp[temp][]+dp[temp][])*wht%MOD;
}
} void work()
{
dfs();
cout<<dp[][]<<endl;
} int main()
{
read();
work();
}

Codeforces 461B Appleman and Tree:Tree dp的更多相关文章

  1. Codeforces 461B Appleman and Tree(木dp)

    题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k ...

  2. Codeforces 461B - Appleman and Tree 树状DP

    一棵树上有K个黑色节点,剩余节点都为白色,将其划分成K个子树,使得每棵树上都仅仅有1个黑色节点,共同拥有多少种划分方案. 个人感觉这题比較难. 如果dp(i,0..1)代表的是以i为根节点的子树种有0 ...

  3. Codeforces 461B Appleman and Tree

    http://codeforces.com/problemset/problem/461/B 思路:dp,dp[i][0]代表这个联通块没有黑点的方案数,dp[i][1]代表有一个黑点的方案数 转移: ...

  4. Codeforces 461B. Appleman and Tree[树形DP 方案数]

    B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  5. CodeForces 461B Appleman and T

    题目链接:http://codeforces.com/contest/461/problem/B 题目大意: 给定一课树,树上的节点有黑的也有白的,有这样一种分割树的方案,分割后每个子图只含有一个黑色 ...

  6. Codeforces 432D Prefixes and Suffixes:KMP + dp

    题目链接:http://codeforces.com/problemset/problem/432/D 题意: 给你一个字符串s,让你找出所有既是前缀又是后缀的子串,并输出它们分别出现了多少次. 题解 ...

  7. Codeforces 148D Bag of mice:概率dp 记忆化搜索

    题目链接:http://codeforces.com/problemset/problem/148/D 题意: 一个袋子中有w只白老鼠,b只黑老鼠. 公主和龙轮流从袋子里随机抓一只老鼠出来,不放回,公 ...

  8. Codeforces 366C Dima and Salad:背包dp

    题目链接:http://codeforces.com/problemset/problem/366/C 题意: 有n个物品,每个物品有两个属性a[i]和b[i]. 给定k,让你选出一些物品,使得 ∑ ...

  9. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)

    题目链接 D. Appleman and Tree time limit per test :2 seconds memory limit per test: 256 megabytes input ...

随机推荐

  1. smarty模版使用php标签,如何获取模版变量

    smarty模版使用php标签,如何获取模版变量 in: 后端程序 已经assign一个模版变量$assign,由于要做特殊的循环输出,使用for循环,因此使用到了php标签,但是php语句和模版语句 ...

  2. MVC进阶学习--View和Controller之间的数据传递(一)

    1.使用ViewData ViewData 的是ControllerBase 的一个属性,是一个数据字典类型的,其实现代码如(这段代码来自asp.net MVC开源项目中源码)下: Code   1  ...

  3. 题目1 : Farthest Point

    时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 Given a circle on a two-dimentional plane. Output the integral ...

  4. 【JMeter4.0学习(九)】之定时器

    目录: 固定定时器 高斯随机定时器 附 一.固定定时器 1.添加线程组 2.添加固定定时器 3.添加HTTP请求 4.添加结果树以及运行  二.高斯随机定时器 1.添加线程组 2.添加高斯随机定时器 ...

  5. django form 表单验证

  6. 多语言中的“默认语言”设置

    最近在搞一个多语言的东西,打算如果用户是中文环境就显示中文,其他任何非中文环境就显示英文.换句话说,把默认语言设置成英文. 不过因为VS是中文的,发现即使默认资源文件是英文(AppResource.r ...

  7. c++的检测的确比C++更严格

    见下面代码 #include <stdio.h> #include <stdlib.h> #include <time.h> enum guess { paper, ...

  8. spring boot数据库操作汇总

    1 关于orm orm即object relational mapping,对象关系映射,即将数据库中的表映射成对象. 常用的orm有以下: mybatis spring jdbc template ...

  9. 让Xcode支持高版本系统设备真机测试

    最新支持11.2 (15C107) Xcode只可以支持iPhone手机对应iOS系统以下的真机测试.一般想要支持最新的iPhone手机系统,有两个方法. 第一.就需要更新Xcode,这一个方法有一个 ...

  10. (转)如何使VMware ip与本机ip处于同一网段

    如何使VMware ip与本机ip处于同一网段 原创 2017年05月08日 17:28:56 1287 首先确认本机ip  可以看出一下信息: 本机ip: 192.168.1.162 网关:192. ...