855C Helga Hufflepuff's Cup

传送门

题目大意

给你一棵树,可以染m种颜色,现定义一种特殊的颜色K,一棵树上最多能有x个特殊颜色。如果一个节点为特殊颜色,那么他相邻的节点的值只能选比K小的颜色,问一共有多少种染色方案。

分析

不难想出这是一个树型dp,用dp[i][j][k]表示考虑第i个点所选的颜色的种类为j,共用了k个特殊颜色。j的状态分别是0代表[1,K-1],1代表[K+1,m],2代表K。然后我们考虑如何转移。首先我们不难想到对于每种状态它是由之前哪种状态转移来的(见代码),对于k的枚举我们可以依次考虑一个点的所有儿子,然后每一次用当前儿子的值更新这个点的dp值。我们假设之前所有儿子和这个点自己一共选了k1个特殊颜色,而这个儿子及其子树选了k2个特殊颜色,这样就可以转移了。详见代码。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define li long long
const li mod = 1e9+7;
li n,m,x,sum,dp[101000][3][12],now[3][12];
vector<li>v[101000];
inline void dfs(li a,li fa){
      dp[a][0][0]=m-x;
      dp[a][1][0]=x-1;
      dp[a][2][1]=1;
      for(li i=0;i<v[a].size();i++)
        if(v[a][i]!=fa){
          dfs(v[a][i],a);
          memset(now,0,sizeof(now));
          for(li k=0;k<=sum;k++)
            for(li k2=0;k2+k<=sum;k2++){
                now[0][k+k2]=(now[0][k+k2]+(dp[a][0][k]*
                (dp[v[a][i]][0][k2]+dp[v[a][i]][1][k2]))%mod)%mod;
              now[1][k+k2]=(now[1][k+k2]+(dp[a][1][k]*(dp[v[a][i]][0][k2]
                +dp[v[a][i]][1][k2]+dp[v[a][i]][2][k2])%mod))%mod;
              now[2][k+k2]=(now[2][k+k2]+
                (dp[a][2][k]*dp[v[a][i]][1][k2]%mod))%mod;
            }
          for(li k=0;k<=sum;k++){
            dp[a][0][k]=now[0][k];
            dp[a][1][k]=now[1][k];
            dp[a][2][k]=now[2][k];
          }
        }
      return;
}
int main(){
      li i,j,k;
      scanf("%lld%lld",&n,&m);
      memset(dp,0,sizeof(dp));
      for(i=1;i<n;i++){
          li a,b;
          scanf("%lld%lld",&a,&b);
          v[a].push_back(b);
          v[b].push_back(a);
      }
      scanf("%lld%lld",&x,&sum);
      dfs(1,0);
      li ans=0;
      for(i=0;i<3;i++)
        for(j=0;j<=sum;j++)
          ans=(ans+dp[1][i][j])%mod;
      printf("%lld\n",ans);
      return 0;
}

855C Helga Hufflepuff's Cup

原文地址:https://www.cnblogs.com/yzxverygood/p/9490192.html

时间: 2024-08-30 14:31:14

855C Helga Hufflepuff's Cup的相关文章

Helga Hufflepuff&#39;s Cup CodeForces - 855C

Helga Hufflepuff's Cup CodeForces - 855C 题意:给一棵n个节点的树,要给每一个节点一个附加值,附加值可以为1-m中的一个整数.要求只能有最多x个节点有附加值k.如果某个节点的附加值是k,那么与其直接相连的点的附加值都必须小于k.求给整棵树的点赋附加值时满足要求的总方案数. 方法: http://blog.csdn.net/ssimple_y/article/details/78081586 ans[i][j][k]表示以i节点为根的子树上选j个最高值且k满

codeforces:Helga Hufflepuff&#39;s Cup

题目大意:有一个包含n个顶点的无向无环连通图G,图中每个顶点都允许有一个值type,type的范围是1~m.有一个特殊值k,若一个顶点被赋值为k,则所有与之相邻的顶点只能被赋小于k的值.最多有x个顶点被赋值为k.求问有多少种不同的赋值方案. 这是一道树形DP的题目.由于是无环无向连通图,因此可以任选一个顶点R作为根结点,从而构造一颗树TREE.为每个顶点N维护一个属性maybe[3][x+1].其中maybe[0][i]表示当N被赋小于k的值时,N及其所有后代结点总共出现i个被赋值为k的结点的总

C. Helga Hufflepuff&#39;s Cup 树形dp 难

C. Helga Hufflepuff's Cup 这个题目我感觉挺难的,想了好久也写了很久,还是没有写出来. dp[i][j][k] 代表以 i 为根的子树中共选择了 j 个特殊颜色,且当前节点 i 的状态为 k 的染色方案数. k=0 ,代表当前节点 i 的颜色值小于 K . k=1,代表当前节点 i 的颜色值等于 K . k=2,代表当前节点 i 的颜色值大于 K . 但是这个dfs过程的处理我觉得很复杂. 我们需要一个数组来进行临时的存储. tmp[i][k] 表示选了 i 个  状态为

HDU 2289 Cup

Cup Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5597    Accepted Submission(s): 1787 Problem Description The WHU ACM Team has a big cup, with which every member drinks water. Now, we know th

ZOJ 1584:Sunny Cup 2003 - Preliminary Round(最小生成树&amp;amp;&amp;amp;prim)

Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the planet w-503 of galaxy cgb, there is a kind of intelligent creature named QS. QScommunicate with each other via networks. If two QS want to get connected, they

uva 6757 Cup of Cowards(中途相遇法,貌似)

uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 di?erent characters (Mage, Tank, Fighter,Assassin and Marksman). A team consists of 5 players (one from each kind) and the goal is to kill amonster with L life points. The

[BZOJ 3145][Feyat cup 1.5]Str 解题报告

[Feyat cup 1.5]Str DescriptionArcueid,白姬,真祖的公主.在和推倒贵看电影时突然对一个问题产生了兴趣:我们都知道真祖和死徒是有类似的地方.那么从现代科学的角度如何解释呢?自然就得研究遗传密码了.Arcueid得知了两者的DNA片段,想寻求一个DNA片段,使得其在两者的DNA中都出现过.我们知道公主的脑袋有点不太灵活,如果两个DNA片段只有一个位置不同,她也会将其认为是相同的.所以请您找出这样的最长的DNA片段吧.Input两行,每行一个字符串.Output一个

pat1011. World Cup Betting (20)

1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excited as the best players from the best teams doing battl

POJ1953 World Cup Noise

这题纯暴力会超时,只需简单推一下递推公式即可,其实就是一个斐波拉契数列. World Cup Noise Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15937   Accepted: 7861 Description Background "KO-RE-A, KO-RE-A" shout 54.000 happy football fans after their team has reached the