Codeforces 486D Valid Sets:Tree dp【n遍O(n)的dp】
题目链接:http://codeforces.com/problemset/problem/486/D
题意:
给你一棵树,n个节点,每个节点的点权为a[i]。
问你有多少个连通子图,使得子图中的max(a[i]) - min(a[i]) <= d。
ps.连通子图的定义:
如果一个点集V为一个连通子图,则对于任意两点a,b∈V,有a到b路径上的所有点u∈V。
题解:
因为要保证max(a[i]) - min(a[i]) <= d,所以可以人为地选出一个点rt作为点权最大的点。
这样在求以rt为最大点的连通子图个数时,只用考虑点权不超过a[rt]的点。
然而如果有两个点i,j的点权相同,分别以i,j作为最大点的两堆子图中会有重复。
所以可以定义一下:当以rt作为最大点时,所有点权与a[rt]相等的点,它们的节点编号id[i]必须大于id[rt]。
这样就能避免重复了。
所以最终答案 = ∑(以i为最大点的连通子图个数)
求以i为最大点的连通子图个数,只需一遍O(n)的dp就行。
注意,当前这是一棵无根树。以下所说的“i的子树”意思是:从i出发往叶子方向的那一堆点。
假设当前以rt作为最大点。
则加入连通子图的点i必须满足:
(1)a[rt]-a[i]<=d(保证满足题目条件)
(2)a[i]<=a[rt](保证a[rt]为最大点)
(3)如果a[i]==a[rt] && i!=rt,则要满足rt<i(避免重复计数)
表示状态:
dp[i] = numbers
表示节点i肯定要选,i的子树所构成的合法连通子图个数
找出答案:
每次ans += dp[rt]
如何转移:
dp[i] = ∏ (dp[son]+1)
边界条件:
对于叶子结点leaf: dp[leaf] = 1
总复杂度O(n^2)。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 2005
#define MOD 1000000007 using namespace std; int n,d;
int a[MAX_N];
vector<int> edge[MAX_N]; void read()
{
cin>>d>>n;
for(int i=;i<=n;i++) cin>>a[i];
int x,y;
for(int i=;i<n;i++)
{
cin>>x>>y;
edge[x].push_back(y);
edge[y].push_back(x);
}
} long long dfs(int now,int p,int rt,int mx)
{
if(mx-a[now]>d || a[now]>mx || (a[now]==mx && p!=- && now<rt)) return ;
long long res=;
for(int i=;i<edge[now].size();i++)
{
int temp=edge[now][i];
if(temp!=p) res=res*(dfs(temp,now,rt,mx)+)%MOD;
}
return res;
} void work()
{
long long ans=;
for(int i=;i<=n;i++) ans=(ans+dfs(i,-,i,a[i]))%MOD;
cout<<ans<<endl;
} int main()
{
read();
work();
}
Codeforces 486D Valid Sets:Tree dp【n遍O(n)的dp】的更多相关文章
- Codeforces 486D Valid Sets (树型DP)
题目链接 Valid Sets 题目要求我们在一棵树上计符合条件的连通块的个数. 满足该连通块内,点的权值极差小于等于d 树的点数满足 n <= 2000 首先我们先不管这个限制条件,也就是先考 ...
- Codeforces 486D. Valid Sets
D. Valid Sets time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Codeforces Round #277 (Div. 2) D. Valid Sets (DP DFS 思维)
D. Valid Sets time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Codeforces Round #277 (Div. 2) D. Valid Sets DP
D. Valid Sets As you know, an undirected connected graph with n nodes and n - 1 edges is called a ...
- codeforces 486 D. Valid Sets(树形dp)
题目链接:http://codeforces.com/contest/486/problem/D 题意:给出n个点,还有n-1条边的信息,问这些点共能构成几棵满足要求的树,构成树的条件是. 1)首先这 ...
- Codeforces Round #277 (Div. 2) D. Valid Sets 暴力
D. Valid Sets Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/486/problem ...
- Codeforces 461B Appleman and Tree(木dp)
题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k ...
- Codeforces 442D Adam and Tree dp (看题解)
Adam and Tree 感觉非常巧妙的一题.. 如果对于一个已经建立完成的树, 那么我们可以用dp[ i ]表示染完 i 这棵子树, 并给从fa[ i ] -> i的条边也染色的最少颜色数. ...
- Codeforces 280C Game on tree【概率DP】
Codeforces 280C Game on tree LINK 题目大意:给你一棵树,1号节点是根,每次等概率选择没有被染黑的一个节点染黑其所有子树中的节点,问染黑所有节点的期望次数 #inclu ...
随机推荐
- Ubuntu 16.04.5下FFmpeg编译与开发环境搭建
PC环境: Ubuntu 18.04 上面只要安装下面的提示安装即可,基本上不必再下载依赖库的源代码进行编译和安装 编译步骤: 1, 安装相关工具: sudo apt install -y auto ...
- HTML5 2D平台游戏开发#6地图绘制
此前已经完成了一部分角色的动作,现在还缺少可以交互的地图让游戏看起来能玩.不过在开始之前应当考虑清楚使用什么类型的地图,就2D平台游戏来说,一般有两种类型的地图,Tile-based和Art-base ...
- centos7 安装postgresql10
https://blog.csdn.net/rudy5348/article/details/79299162
- Python读取word文档(python-docx包)
最近想统计word文档中的一些信息,人工统计的话...三天三夜吧 python 不愧是万能语言,发现有一个包叫做 docx,非常好用,具体查看官方文档:https://python-docx.read ...
- 创建一个动态Web项目:
开始你的Eclipse,然后进入“文件”>“新建”>“动态Web项目,然后输入项目名称为HelloWorldStruts2和设置其他的选项,在下面的屏幕: 选择在屏幕上的所有默认选项,最后 ...
- unittest 结合 ddt
数据驱动测试ddt,使用的重点: 1.@ddt.ddt2.@ddt.data(*zip(range(10),range(10,20))) 注意一定要带* 3.@ddt.unpack # c ...
- CSS3 线性渐变(linear-gradient)
CSS3 Gradient 分为 linear-gradient(线性渐变)和 radial-gradient(径向渐变).而我们今天主要是针对线性渐变来剖析其具体的用法.为了更好的应用 CSS3 G ...
- EL 表达式 函数 操作 字符串
<%@tablib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> ${fn ...
- Win7程序运行出现Windows Based Scrip Host 已停止工作问题的解决方法
最近在使用类似于Teamviewer这样的程序时,突然运行不了,报错:Microsoft Windows Based Scrip Host 已停止工作的问题,从系统日志来看,好像是空指针问题,但是又无 ...
- python 发送邮件的两种方式【终极篇】
一,利用python自带的库 smtplib简单高效 from email.mime.multipart import MIMEMultipart from email.mime.text impor ...