Codeforce 486D(树形dp)
来源:互联网 发布:女生提气质知乎 编辑:程序博客网 时间:2024/06/05 00:56
链接:点击打开链接
题意:给出一个n个点的树,给出每个点的权值,问存在多少个集合,使得集合中两两可以互相到达,并且最大值减去最小值小于等于d
代码:
#include <math.h>#include <vector>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const long long MOD=1000000007;long long d,dp[2005],val[2005];vector<long long> G[2005];void dfs(long long s,long long fa,long long rt){ long long i,tmp; dp[s]=1; for(i=0;i<G[s].size();i++){ tmp=G[s][i]; if(tmp==fa) continue; dfs(tmp,s,rt); //保证的最大,并且差值小于d if((val[rt]>val[tmp]&&val[rt]-val[tmp]<=d)||(val[rt]==val[tmp]&&rt<tmp)) dp[s]=(dp[s]+dp[s]*dp[tmp])%MOD; //但是当值相等时,必定会出现重复的情况 } //所以值相等时,只能从编号小的点到大的点}int main(){ long long n,i,j,u,v,ans; while(scanf("%I64d%I64d",&d,&n)!=EOF){ for(i=1;i<=n;i++) G[i].clear(); for(i=1;i<=n;i++) scanf("%I64d",&val[i]); for(i=1;i<n;i++){ scanf("%I64d%I64d",&u,&v); G[u].push_back(v); G[v].push_back(u); } ans=0; for(i=1;i<=n;i++){ //将每个点看做值最大的根节点进行dfs memset(dp,0,sizeof(dp)); dfs(i,-1,i); ans=(ans+dp[i])%MOD; } printf("%I64d\n",ans); } return 0;}
0 0
- Codeforce 486D(树形dp)
- Codeforce 219D(树形dp)
- Codeforce 337D 容斥+树形dp
- codeforce 743 D. Chloe and pleasant prizes (树形dp)
- codeforce 143D dp
- Codeforce 581F(树形dp)
- Codeforce 490E(树形dp)
- Codeforce 540D(概率dp)
- codeforces 486D D. Valid Sets(树形dp)
- codeforces 486D D. Valid Sets(树形dp)
- codeforce 67D - Optical Experiment(dp)
- Codeforce 149D(区间dp+括号匹配)
- CodeForce 628D Magic Numbers( 数位DP )
- 状态压缩DP 树形D
- Codeforces 161D 树形DP
- CF 219D 树形dp
- Codeforces 61D--树形dp
- codeforces-743D-树形dp
- 数组函数
- 嗯,记一道水题
- 从JDK源码分析Java中的equals与hashCode
- 高通LCD之背光
- 前端.进度条样式的原理与解释
- Codeforce 486D(树形dp)
- 队列的使用
- 聊聊STM32芯片的DFU编程及相关话题
- OverTheWire的Natas题
- 分割数组
- js实现发送短信验证码后60秒倒计时
- spring学习总结(四):IOC & DI 配置 Bean 之注入属性细节
- 正则表达式、Math、SimpleDateFromat、Calendar类+JAVA学习笔记-DAY14
- S5PV210时钟配置