题目链接: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. 好员工去哪儿了:高端IT白领荒胜过春节保姆荒

    来自:http://tech.163.com/14/0312/07/9N4BLV8S000915BD.html 于是,你看到的就是这样一幕悖论:一群手握大把工作机会的雇主,在面对一群眼巴巴等待工作机会 ...

  2. rm 命令简要

    rm   单独使用只能删除文件不能删除文件夹    rm -r 可以删除文件夹和文件 1.rm   test.txt   删除文件 2.rm   -r   test.txt   每次删除的时候都询问是 ...

  3. Redis源码阅读-sds字符串源码阅读

    redis使用sds代替char *字符串, 其定义如下: typedef char *sds; struct sdshdr { unsigned int len; unsigned int free ...

  4. 09 Memcached 分布式之取模算法的缺陷

    一: Memcached 分布式之取模算法的缺陷(1)假设你有8台服务器,运行中突然down一台,则求余数的底数就7. 后果: key_0%8==0 ,key_0%7==0 =>hist(命中) ...

  5. Android Studio导入eclipse工程(引用多个其它工程)

    eclipse工程向android studio 迁移过程中需要到编译错误: eclipse工程的结构比较复杂,引用了其它的工程,在迁移的过程中遇到了错误. @ViewInject(R.id.edit ...

  6. Huffman编码(Huffman树)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...

  7. flex hack 记录

    IE从IE10开始. //共通 display: flex; flex-direction: column; align-items: flex-start;justify-content: cent ...

  8. billboard因为合批导致出问题的一个想法

    由于unity中距离较近的2个billboard物体会动态合批,如果缩放不同,显示就有问题.还得在shader中"DisableBatching"="true" ...

  9. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元

    [BZOJ1778][Usaco2010 Hol]Dotp 驱逐猪猡 Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300 ...

  10. cmder 使用 linux bash 管道符 | grep 来筛选文件

    ls -l | grep -i fira -rw-r--r-- 用户名 Feb : FiraCode-Bold.otf -rw-r--r-- 用户名 Nov FiraCode-Bold_01.ttf ...