Codeforces 855C. Helga Hufflepuff's Cup----树形DP
z最近在学习树形DP...好难啊。
在cf上找到了一题c题当模版马克一下。
题目不贴了。。>>http://codeforces.com/problemset/problem/855/C<<
题目的意思就是给你一棵有n个节点的树,m个关系,每个节点需要上色,一共有K种颜色,其中有一个最大色,与他相邻的节点只能上比他“小”的颜色。并且最多有X个节点可以染最大色。求问染色方法有多少种。
代码如下:
#include<vector>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
const int mod=1e9+;
int n,m,K,X;
vector<int> e[];//用来存储树枝(双向)
long long dp[][][];//dp主体,分别表示节点、选择最大色的节点数,最后一个空的0,1,2分别表示“选比最大色小的颜色时”
//“选最大色时”、“选比最大色大的颜色时” int sz[100010]={0};//表示递归到该节点时已选最大色的数目
int t[12][3];
int sz[100010]={0};
int t[12][3];
long long dfs(int x,int pre)
{
dp[x][0][0]=K-1;
dp[x][1][1]=1;
dp[x][0][2]=m-K;
sz[x]=1;
int i,xx,j,k;
for(i=0;i<e[x].size();i++)
{
xx=e[x][i];
if(xx==pre) continue;
dfs(xx,x);
memset(t,0,sizeof(t));
for(j=0;j<=sz[x];j++)
for(k=0;k<=sz[xx];k++)
{
if(j+k>X) continue;
t[j+k][0]=(t[j+k][0]+(dp[x][j][0]*(dp[xx][k][0]+dp[xx][k][1]+dp[xx][k][2]))%mod)%mod;
t[j+k][1]=(t[j+k][1]+(dp[x][j][1]*dp[xx][k][0]%mod))%mod;
t[k+j][2]=(t[k+j][2]+(dp[x][j][2]*(dp[xx][k][0]+dp[xx][k][2])%mod))%mod;
}
sz[x]=min(sz[x]+sz[xx],X);
for(j=0;j<=sz[x];j++)
for(k=0;k<=2;k++)
{
dp[x][j][k]=t[j][k];
}
}
}
int main()
{
int i,j,k,q,w;
while(cin>>n>>m)
{
long long ans=0;
for(i=1;i<=n;i++) e[i].clear();
for(i=1;i<n;i++)
{
cin>>q>>w;
e[q].push_back(w);
e[w].push_back(q);
}
cin>>K>>X;
dfs(1,-1);
for(j=0;j<=sz[1];j++)
for(k=0;k<=2;k++)
ans=(ans+dp[1][j][k])%mod;
cout<<ans<<endl;
}
}
Codeforces 855C. Helga Hufflepuff's Cup----树形DP的更多相关文章
- Codeforces 855C - Helga Hufflepuff's Cup
855C - Helga Hufflepuff's Cup 题意 要求构建一棵树,树上至多可以存在 \(x\) 个权值为 \(k\) 的重要点,且与重要点连边的点的权值必须小于 \(k\),问有多少种 ...
- C. Helga Hufflepuff's Cup 树形dp 难
C. Helga Hufflepuff's Cup 这个题目我感觉挺难的,想了好久也写了很久,还是没有写出来. dp[i][j][k] 代表以 i 为根的子树中共选择了 j 个特殊颜色,且当前节点 i ...
- 855C Helga Hufflepuff's Cup
传送门 题目大意 给你一棵树,可以染m种颜色,现定义一种特殊的颜色K,一棵树上最多能有x个特殊颜色.如果一个节点为特殊颜色,那么他相邻的节点的值只能选比K小的颜色,问一共有多少种染色方案. 分析 不难 ...
- Helga Hufflepuff's Cup CodeForces - 855C
Helga Hufflepuff's Cup CodeForces - 855C 题意:给一棵n个节点的树,要给每一个节点一个附加值,附加值可以为1-m中的一个整数.要求只能有最多x个节点有附加值k. ...
- codeforces:Helga Hufflepuff's Cup
题目大意:有一个包含n个顶点的无向无环连通图G,图中每个顶点都允许有一个值type,type的范围是1~m.有一个特殊值k,若一个顶点被赋值为k,则所有与之相邻的顶点只能被赋小于k的值.最多有x个顶点 ...
- Codeforces 219D - Choosing Capital for Treeland(树形dp)
http://codeforces.com/problemset/problem/219/D 题意 给一颗树但边是单向边,求至少旋转多少条单向边的方向,可以使得树上有一点可以到达树上任意一点,若有多个 ...
- codeforces 633F The Chocolate Spree (树形dp)
题目链接:http://codeforces.com/problemset/problem/633/F 题解:看起来很像是树形dp其实就是单纯的树上递归,就是挺难想到的. 显然要求最优解肯定是取最大的 ...
- codeforces 486 D. Valid Sets(树形dp)
题目链接:http://codeforces.com/contest/486/problem/D 题意:给出n个点,还有n-1条边的信息,问这些点共能构成几棵满足要求的树,构成树的条件是. 1)首先这 ...
- Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]
题意: 给你一棵有n个节点的树,树的边权都是1. 有m次询问,每次询问输出树上所有节点离其较近结点距离的最大值. 思路: 1.首先是按照常规树形dp的思路维护一个子树节点中距离该点的最大值son_di ...
随机推荐
- 【2017-02-28】C# 冒泡排序
冒泡排序 重复地走访过要排序的数列,一次比较两个元素的大小,如果他们的顺序错误就把他们交换过来 通过两个For循环嵌套来实现 思路——以从小到大为例 第一个for循环抽取第一个数和第二个数进行比较,如 ...
- OpenCV-3.3.0测试
安装包目录下/samples/cpp里是各种例程 其中example_cmake里CMakeLists.txt已写好,直接cmake,make就可以,example.cpp是一个调用笔记本摄像头并显示 ...
- 第三方包源码maven 下载
1,maven导包时候自动下载源码 在eclipse或者Myeclipse中 => window ==> preference ==> Maven ==> 勾选Download ...
- python 怎么让list里面设置NAN numpy.nan
- Kotlin基础学习
Kotlin 和 java 都是一种静态类型的编程语言.表达式的类型在编译期已经确定,编译期能验证对象是否包含想访问方法或是字段,维护正确性与性能的同时保持源代码的简洁 静态类型的 ...
- Array和ArrayList不同
Employee[] array = new Employee[10]; ArrayList<Employee> staff = new ArrayList<>(); 不同 A ...
- spark读取hbase形成RDD,存入hive或者spark_sql分析
object SaprkReadHbase { var total:Int = 0 def main(args: Array[String]) { val spark = SparkSession . ...
- MySQL底层索引剖析
1:Mysql索引是什么 mysql索引: 是一种帮助mysql高效的获取数据的数据结构,这些数据结构以某种方式引用数据,这种结构就是索引.可简单理解为排好序的快速查找数据结构.如果要查“mysql” ...
- MyEclipse如何修改XML文件默认打开的编辑器
1.MyEclipse如何修改XML文件默认打开的编辑器 Windows--->Preferences--->General--->Editors--->File Associ ...
- 通过数组和枚举简化GPIO操作编码(转)
源: 通过数组和枚举简化GPIO操作编码