题目链接:http://codeforces.com/contest/486/problem/D

题意:给出n个点,还有n-1条边的信息,问这些点共能构成几棵满足要求的树,构成树的条件是。

1)首先这颗树非空。

2)这些点必须是联通的。

3)这棵树上最大的权值-最小的权值<=d。

题解:一道明显的树形dp,所以一半就设dp[i]表示以i为根的能构成几棵树。为了方便起见。就将i设为最大的那个点。如果遇到val值相同的话,就定义一

个方向,当val值相同时只能从下表大的点到下表小的点。dfs写法如下:

void dfs(int pos , int pre , int num) {

int len = vc[pos].size();

dp[pos] = 1;//每次递归到的点都要作为根节点所以权值先赋为1。

for(int i = 0 ; i < len ; i++) {

int u = vc[pos][i];

if(u == pre) continue;

  //一下就是转移要满足的条件

if(a[num] < a[u]) continue;

if(a[num] - a[u] > d) continue;

if(a[num] == a[u] && num < u) continue;

dfs(u , pos , num);

dp[pos] = dp[pos] + dp[pos] * dp[u];

dp[pos] %= mod;

}

}

  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4. #define mod 1000000007
  5. using namespace std;
  6. int a[2010] , d , n;
  7. long long dp[2010];
  8. vector<int>vc[2010];
  9. void dfs(int pos , int pre , int num) {
  10. int len = vc[pos].size();
  11. dp[pos] = 1;
  12. for(int i = 0 ; i < len ; i++) {
  13. int u = vc[pos][i];
  14. if(u == pre) continue;
  15. if(a[num] < a[u]) continue;
  16. if(a[num] - a[u] > d) continue;
  17. if(a[num] == a[u] && num < u) continue;
  18. dfs(u , pos , num);
  19. dp[pos] = dp[pos] + dp[pos] * dp[u];
  20. dp[pos] %= mod;
  21. }
  22. }
  23. int main() {
  24. int u , v;
  25. cin >> d >> n;
  26. for(int i = 1 ; i <= n ; i++) {
  27. cin >> a[i];
  28. }
  29. for(int i = 1 ; i < n ; i++) {
  30. cin >> u >> v;
  31. vc[u].push_back(v);
  32. vc[v].push_back(u);
  33. }
  34. long long ans = 0;
  35. for(int i = 1 ; i <= n ; i++) {
  36. dfs(i , 0 , i);
  37. ans += dp[i];
  38. ans %= mod;
  39. }
  40. cout << ans << endl;
  41. return 0;
  42. }

codeforces 486 D. Valid Sets(树形dp)的更多相关文章

  1. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  2. codeforces 337D Book of Evil (树形dp)

    题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...

  3. Codeforces 1276D - Tree Elimination(树形 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 繁琐的简单树形 dp(大雾),要是现场肯定弃了去做 F 题 做了我一中午,写篇题解纪念下. 提供一种不太一样的思路. 首先碰到这样的题肯定 ...

  4. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  5. Codeforces 815C Karen and Supermarket 树形dp

    Karen and Supermarket 感觉就是很普通的树形dp. dp[ i ][ 0 ][ u ]表示在 i 这棵子树中选择 u 个且 i 不用优惠券的最小花费. dp[ i ][ 1 ][ ...

  6. Codeforces 627D Preorder Test(二分+树形DP)

    题意:给出一棵无根树,每个节点有一个权值,现在要让dfs序的前k个结点的最小值最大,求出这个值. 考虑二分答案,把>=答案的点标记为1,<答案的点标记为0,现在的任务时使得dfs序的前k个 ...

  7. Codeforces 919D Substring (拓扑排序+树形dp)

    题目:Substring 题意:给你一个有向图, 一共有n个节点 , m条变, 一条路上的价值为这个路上出现过的某个字符最多出现次数, 现求这个最大价值, 如果价值可以无限大就输出-1. 题解:当这个 ...

  8. Codeforces 633F 树的直径/树形DP

    题意:有两个小孩玩游戏,每个小孩可以选择一个起始点,并且下一个选择的点必须和自己选择的上一个点相邻,问两个选的点权和的最大值是多少? 思路:首先这个问题可以转化为求树上两不相交路径的点权和的最大值,对 ...

  9. Codeforces 461B. Appleman and Tree[树形DP 方案数]

    B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

随机推荐

  1. word 文档导出 (freemaker+jacob)--java开发

    工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂.  学习顺序: 第一阶 ...

  2. vue中使用vue-amap(高德地图)

    因为项目要求调用高德地图,就按照官方文档按部就班的捣鼓,这一路上出了不少问题. 前言: vue-cli,node环境什么的自己安装设置推荐一个博客:https://blog.csdn.net/wula ...

  3. SpringMVC学习笔记之---简单入门

    SpringMVC简单入门 (一)什么是MVC设计模式 (1)model:模型数据,业务逻辑 (3)view:呈现模型,与用户进行交互 (3)controller:负责接收并处理请求,响应客户端 (二 ...

  4. MongoDB之数据库备份与恢复

    MongoDB之数据备份与恢复 一,需求 一段时间备份数据库数据,以防意外导致数据丢失 二,备份与恢复 2.1,数据库备份 1,常用命令格式 mongodump -h IP --port 端口 -u ...

  5. MySQL一键生成实体文件的神器-ginbro

    Java转过来的同学对Mybatis的使用肯定不陌生,特别是对一堆表去生成相应的dao和entity的时候使用Mybatis generator所带来的感触,无比深刻.前面我们也讲过原生的数据库使用, ...

  6. 消息中间件-activemq安全机制

    activemq作为消息中间件这样一个独立的个体存在,连通用户和服务器.如果没有一套完备的安全机制去设置用户权限设置消息分发机制可想后果是非常严重.ActiveMQ如果不加入安全机制的话,任何人只要知 ...

  7. S3 Select for Java 使用记录

    背景 后台基本使用 Amazon 的全家桶(EC2.DynamoDB.S3.Step Fuction 等等)构建.现在需要根据访问者的 IP 确定访问者的国家或地区. 已知: 访问者 IP 一个 ip ...

  8. 面试java后端面经_2

    1 自我介绍(介绍一下帅气的自己哦) 2 对象深浅复制(浅复制:对象内引用的对象不会复制,深复制会把引用对象复制.如何进行深浅复制,这块不懂的童鞋可以百度一下) 3 wait方法和sleep方法的区别 ...

  9. 从IDEA角度来看懂UML图

    前言 我们目前已经学习了设计模式的7种设计原则.下面本该是直接进入具体的设计模式系列文章. 但是呢在我们学习设计模式之前我们还是有必要了解一下uml图.因为后续的设计模式文章不出意外应该会很多地方使用 ...

  10. (三)(1)线程间通信---wait和notify的使用

    这篇博客记录线程间通信相关api使用以及理解. 首先第一点,我之前的博客里的线程之间也是通信的,但是他们的通信是建立在访问的是同一个变量上的,相当于是变量.数据层面上的通信,而下面要讲的是线程层面上的 ...