题目链接: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. 玩转JPA(一)---异常:Repeated column in mapping for entity/should be mapped with insert=&quot;false&quot; update=&quot;fal

    近期用JPA遇到这样一个问题:Repeated column in mapping for entity: com.ketayao.security.entity.main.User column: ...

  2. X264学习1:简介

    H.264是视频编码标准. X264是它的开源实现,是视频编码器. 目录 [隐藏]  1 编码器特性 2 输入输出文件类型 2.1 输入 2.2 输出 3 preset和tune系统 3.1 --pr ...

  3. html5小趣味知识点系列(一)contentEditable

    在这里纠正一下某些书籍说 这个修改后的文字内容是无法保存的 的错误必须发送到服务器进行保存才可以(因为我可以保存到内容)看代码吧  也许我理解的不对 <!DOCTYPE html> < ...

  4. PHP中foreach用法详细讲解

    1.foreach是什么? foreach是PHP的一种语法结构,其实就是一个工具,(工具:就是工作的时候用到的器具),那么在程序开发过程中,为了达到程序效果,就用到了foreach. 2.如何用? ...

  5. Android平台录音音量计的实现

    今天博主要给大家分享的是怎样在Android平台上实现录音时的音量指示计.开门见山.先来看一张Demo的效果图: 如上图所看到的,两个button各自是開始录音和停止录音,中间的两个数字前后分别代表音 ...

  6. python 基础 9.6 设计表结构

    一. 设计表结构    在操作设计数据库之前,我们先要设计数据库表结构,我们就来分析分析经典的学生,课程,成绩,老师这几者他们之间的关系,我们先来分析各个主体他们直接有什么属性,并确定表结构,在实际开 ...

  7. CAFFE学习笔记(四)将自己的jpg数据转成lmdb格式

    1 引言 1-1 以example_mnist为例,如何加载属于自己的测试集? 首先抛出一个问题:在example_mnist这个例子中,测试集是人家给好了的.那么如果我们想自己试着手写几个数字然后验 ...

  8. WINDOWS的用户和用户组说明

    1.基本用户组 Administrators 属于该administators本地组内的用户,都具备系统管理员的权限,它们拥有对这台计算机最大的控制权限,可以执行整台计算机的管理任务.内置的系统管理员 ...

  9. 今天在网上查看了一个socket程序,运行的时候一直报错,经过队友解决?

    1.首先是问题代码ip_port = ('192.168.12.2',8001)2.上边的代码本身没有问题,但是必须经过修改自己本机的局域网IP地址才能顺利链接请参考上一篇blog的地址,查看本机的i ...

  10. iphone传感器

    传感器 什么是传感器 传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上 传感器的作用 用于感应\检测设备周边的信息 不同类型的传感器, 检测的信息也不一样 iPhone中的下面现象都是由传感 ...