题目链接: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. bzoj4069【APIO2015】巴厘岛的雕塑

    4069: [Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 192  Solved: 89 [Submit][Stat ...

  2. android:分享 一个非常强大的LOG开关---Log.isLoggable

    1.API亮点: 此API能够实现不更换APK.在出问题的手机上就直接能抓到有效log,能提升不少工作效率. .API介绍 近期在解决短信问题时.看到一个非常强大的LOG开关---Log.isLogg ...

  3. iOS系列译文:自定义Collection View布局

    原文出处: Ole Begemann   译文出处: 黄爱武(@answer-huang).欢迎加入技术翻译小组. UICollectionView在iOS6中第一次被介绍,也是UIKit视图类中的一 ...

  4. Java反射学习系列-绪论

    Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924

  5. 多媒体开发之---h264格式slice_header

    从Slice_Header学习H.264 写在前面: $     H.264我是结合标准和毕厚杰的书一块学的.看句法语义时最是头疼,一大堆的元素,很需要耐心.标准中在介绍某个元素的语义时,经常会突然冒 ...

  6. XtraBackup全备与增量备份

    一.XtraBackup安装 下载地址:http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.8/source/ 安装步骤: ===== ...

  7. windows下XAMPP安装php_memcache扩展

    windows下XAMPP安装php_memcache扩展 首先下载phpmemcache,地址为: http://up.2cto.com/2012/0522/20120522094758371.ra ...

  8. HDU 5045 5047 5050 5053(上海网络赛E,F,I,L)

    HDU 5045 5047 5050 5053 太菜了,名额差点没保住.吓尿..赶紧开刷树链抛分 5045:状压DP.压缩10个人.因为两个人不能差2以上,所以能够用01表示 5047:推推公式就可以 ...

  9. IOS下移除按钮默认美化样式

    今天在做项目中发现 ios会自己美化按钮的样式  美化的一般都是加一个圆角 也就是常说的border-radius 属性    今天在弄一个input标签的时候加了一个border-bottom属性  ...

  10. nginx学习之简化安装篇(一)

    环境:CentOS 6.5 1. 安装依赖环境 [root@localhost ~]# yum install pcre-devel zlib-devel openssl-devel -y 2. 安装 ...