【链接】h在这里写链接


【题意】


    k是最高级别的分数,最高界别的分数最多只能有x个。

    1<=k<=m;



    和k相邻的点的分数只能小于k;



    n个点的树,问你每个点的分数的安排,方案数%1e9+7

【题解】


    设

    f[i][j][0];//这棵子树下面有j个最高级别的点,这个点放Top点的方案数

    f[i][j][1];//这棵子树下面有j个最高级别的点,这个点放小于等于k-1的点的方案数

    f[i][j][2];//这棵子树下面有j个最高级别的点,这个点放大于k的点的方案数

    叶子节点

        f[i][1][0] = 1;

        f[i][0][1] = k-1;

        f[i][0][2] = m - k;



    然后进行转移

        for (int i = limit; i >= 0; i--)//枚举x节点它的重要节点个数

        {

            //这里的i必须是逆序的,这样才可保证f[x][i-j]访问到的是x这个节点前面

            //的儿子的方案数

            //显然也必须用3个temp->s0,s1,s2来暂存到这个儿子为止的 f[x][]信息了。

            //之后再复制给temp就好

            ll s0 = 0, s1 = 0, s2 = 0;

            for (int j = 0; j <= i; j++)//枚举y的重要节点个数

            {

                //x这个节点放重要节点方案

                if (i != j) s0 += f[y][j][1] * f[x][i - j][0]%MOD;

                //这里的f[x][i-j][0]指的是x这个节点前面的儿子的方案

                s0 %= MOD;

                //y只能放小于等于k-1的了



                s1 += (f[y][j][0] + f[y][j][2] + f[y][j][1])%MOD*f[x][i - j][1]%MOD;

                s1 %= MOD;

                //x放小于等于k-1的,则y可以放Top点也可以放大于K的点也可以放小于k的



                s2 += (f[y][j][1] + f[y][j][2])%MOD* f[x][i - j][2]%MOD;

                s2 %= MOD;

                //x放大于K的点,y能放大于k以及小于等于k-1的点

            }

            f[x][i][0] = s0;

            f[x][i][1] = s1;

            f[x][i][2] = s2;

        }

    最后对f[1][0..x][0..2]求和

【错的次数】


0

【反思】


根据区间写DP的状态。
这个思路挺好的。
枚举父亲和儿子节点的重要点,有点像选课那题。
用到了01背包去掉第一维的思想.
暂存到另外一个数组,再赋值回去。
防止造成错乱,维护前缀最优~

【代码】

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int N = 1e5;
const int MOD = 1e9 + 7;
const int X = 10; int n, m,k,limit;
ll f[N + 10][X+5][3];
vector<int> g[N+10]; void dfs(int x, int fa)
{
//叶子节点
f[x][1][0] = 1;
f[x][0][1] = k - 1;
f[x][0][2] = m - k;
for (int y : g[x])
{
if (y == fa) continue;
dfs(y, x);
//前面的儿子选了j个,状态为3的方案数
//f[x][j][3]
for (int i = limit; i >= 0; i--)//枚举x节点它的重要节点个数
{
ll s0 = 0, s1 = 0, s2 = 0;
for (int j = 0; j <= i; j++)//枚举y的重要节点个数
{
//x这个节点放重要节点方案
if (i != j) s0 += f[y][j][1] * f[x][i - j][0]%MOD;
s0 %= MOD;
//y只能放小于等于k-1的了 s1 += (f[y][j][0] + f[y][j][2] + f[y][j][1])%MOD*f[x][i - j][1]%MOD;
s1 %= MOD;
//x放小于等于k-1的,则y可以放Top点也可以放大于K的点也可以放小于k的 s2 += (f[y][j][1] + f[y][j][2])%MOD* f[x][i - j][2]%MOD;
s2 %= MOD;
//x放大于K的点,y能放大于k以及小于等于k-1的点
}
f[x][i][0] = s0;
f[x][i][1] = s1;
f[x][i][2] = s2;
}
}
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n - 1; i++)
{
int x, y;
scanf("%d%d", &x, &y);
g[x].push_back(y), g[y].push_back(x);
}
scanf("%d%d", &k, &limit);
dfs(1, 0);
ll ans = 0;
for (int i = 0; i <= limit; i++)
{
for (int j = 0; j < 3; j++)
{
ans = ans + f[1][i][j];
ans %= MOD;
}
}
printf("%lld\n", ans);
return 0;
}

【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup的更多相关文章

  1. 【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring

    [链接]h在这里写链接 [题意] 给你n个数字; 让你在其中找出三个数字i,j,k(i<=j<=k); 使得p*a[i]+q*a[j]+r*a[k]最大; [题解] /*     有一个要 ...

  2. 【CF Manthan, Codefest 17 A】Tom Riddle's Diary

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] /* Be careful. 二重循环枚举 */ [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/st ...

  3. 【DP】【CF855C】 Helga Hufflepuff's Cup

    Description 给你一个树,可以染 \(m\) 个颜色,定义一个特殊颜色 \(k\) , 要求保证整棵树上特殊颜色的个数不超过 \(x\) 个.同时,如果一个节点是特殊颜色,那么它的相邻节点的 ...

  4. Manthan, Codefest 17

    A. Tom Riddle's Diary time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  5. Helga Hufflepuff's Cup CodeForces - 855C

    Helga Hufflepuff's Cup CodeForces - 855C 题意:给一棵n个节点的树,要给每一个节点一个附加值,附加值可以为1-m中的一个整数.要求只能有最多x个节点有附加值k. ...

  6. Codeforces 855C - Helga Hufflepuff's Cup

    855C - Helga Hufflepuff's Cup 题意 要求构建一棵树,树上至多可以存在 \(x\) 个权值为 \(k\) 的重要点,且与重要点连边的点的权值必须小于 \(k\),问有多少种 ...

  7. C. Helga Hufflepuff's Cup 树形dp 难

    C. Helga Hufflepuff's Cup 这个题目我感觉挺难的,想了好久也写了很久,还是没有写出来. dp[i][j][k] 代表以 i 为根的子树中共选择了 j 个特殊颜色,且当前节点 i ...

  8. 【codeforces.com/gym/100240 J】

    http://codeforces.com/gym/100240 J [分析] 这题我搞了好久才搞出样例的11.76....[期望没学好 然后好不容易弄成分数形式.然后我‘+’没打..[于是爆0... ...

  9. 【Codeforces Global Round 1 C】Meaningless Operations

    [链接] 我是链接,点我呀:) [题意] 给你一个a 让你从1..a-1的范围中选择一个b 使得gcd(a^b,a&b)的值最大 [题解] 显然如果a的二进制中有0的话. 那么我们就让选择的b ...

随机推荐

  1. 关于判断是安卓还是ios环境跳转下载页

    H5项目中判断是安卓还是iOS手机就跳转到不同的下载页,项目如下https://github.com/JserJser/dailyPush/tree/master/daily6/H5 这个项目里面我比 ...

  2. 3.Spring框架中的标签与配置文件分离

    1.Spring框架中标签的配置 1. id属性和name属性的区别 * id -- Bean起个名字,在约束中采用ID的约束,唯一 * 取值要求:必须以字母开始,可以使用字母.数字.连字符.下划线. ...

  3. 主从复制系列A

    一.主从原理 Replication 线程   Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql in ...

  4. python使用SUDS调用webservice

    最近做接口对接,遇到了.net开发的webservice接口,因为python第一次与webservice对接,连问带查,最后使用suds库来实现了 1.安装suds mac: sudo pip in ...

  5. vue.js_01_vue.js的入门

    1.什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于 ...

  6. SpringData _day01_jpa的入门

    1.orm思想和以及jpa的概述和jpa的基本操作 简单的说:ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的. orm思想    主要目的:操作实体类就相当于操 ...

  7. [转]js模块化——AMD及require.js

    由CommonJS组织提出了许多新的JavaScript架构方案和标准,希望能为前端开发提供统一的指引.AMD规范就是其中比较著名一个,全称是Asynchronous Module Definitio ...

  8. WPF DataGrid 数据绑定之"List配合Dictionary"

    WPF 的DataGrid是WPF中最为强大的控件之一,可以通过各种方式绑定 例如通过最为形似的dataTable来绑定 本文则用List<Dictionary<K,V>>来绑 ...

  9. 44个 Javascript 变态题解析 (下)

    承接上篇 44个 Javascript 变态题解析 (上) 第23题 [1 < 2 < 3, 3 < 2 < 1] 这个题也还可以. 这个题会让人误以为是 2 > 1 & ...

  10. 第一个SpringBoot插件-捕获请求并且支持重新发起

    SpringBoot 插件入门 简介 公司用的是SpringBoot,api框架用的是swagger-ui,确实用的不错,但是在使用过程中发现一个问题,就是当前端正式调用的时候,如果参数一多的话模拟请 ...