题意 给了n个点的数 每个点有一个w[i]权值,如果你选择了i这个点那么距离i这个点距离为w[i]的点将被除去,最后问 选则尽量少的点把这n个点全部删除

1<=n<=100000, 0<=w<=100,

down[i][j]表示以i为根节点的树 在他的子树中在距离他 j距离 范围内存在至少一个点没有被除去所选择的最少点数

up[i][j] 表示以i为根的树 他的子树全部都被除去,并且距离他为j的其他点可被除去 所选择的最小点数

考虑状态转移

如果第i个点不选

那么

j=0时

down[i][0]=sigma(up[v][0]){v为i的孩子}

up[i][0] =min(up[i][0], up[v][1]+down[i][0]-up[v][0]){v为i的孩子}

j!=0的时候

down[i][j]=down[i][j]+down[v][j-1](v为i的孩子)

up[i][j]=min(up[i][j],up[v][j+1]+down[i][j]-down[v][j-1]){v为i的孩子 , 自然你也可以在他的孩子中在j范围内取更多的点,但是好好想想这样是没有必要的}

选了这个点

那么up[i][j]=min( up[i][j] , Sigma(G[v][w[i]-1]) ) {v为i的孩子,自然也可以选择更进的点 但是也是没有必要的 因为我们每次都更新了G[v][w[i]-1]的值 }

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <string.h>
using namespace std;
const int maxn =+;
const int maxm=+;
int up[maxn][maxm],down[maxn][maxm],w[maxn];
vector<int>G[maxn];
int n;
void dfs(int cur, int per)
{
for(int i=; i<=; i++)up[cur][i]=n;
memset(down[cur],,sizeof(down[cur]));
int siz =G[cur].size();
int sum=;
for(int i=; i<siz; i++)
{
int to=G[cur][i];
if(to==per)continue;
dfs(to,cur);
if(w[cur]) sum+=down[to][w[cur]-];
else sum+=up[to][];
down[cur][]+=up[to][];
for(int j=; j<=; j++)
down[cur][j]+=down[to][j-];
}
for(int i=; i<siz; i++)
{
int to=G[cur][i];
if(to==per)continue;
up[cur][]=min(up[cur][],up[to][]+down[cur][]-up[to][]);
for(int j=; j<; j++)
up[cur][j]=min(up[cur][j],up[to][j+]+down[cur][j]-down[to][j-]);
}
for(int i=; i<=w[cur]; i++)up[cur][i]=min(up[cur][i],sum);
for(int i=; i>=;i--)up[cur][i]=min(up[cur][i],up[cur][i+]);
down[cur][]=min(down[cur][],up[cur][]);
for(int i=; i<=; i++)
down[cur][i]=min(down[cur][i],down[cur][i-]);
}
int main()
{
while(scanf("%d",&n)==)
{
for(int i=; i<=n; i++)
{
scanf("%d",&w[i]);
G[i].clear();
}
for(int i=; i<n; i++)
{
int a,b;
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
}
dfs(,);
int ans=n;
for(int i=; i<=; i++)ans=min(ans,up[][i]);
printf("%d\n",ans);
}
return ;
}

hdu5290树形dp的更多相关文章

  1. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  2. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  3. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  4. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  5. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  6. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  7. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  8. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  9. bzoj2500: 幸福的道路(树形dp+单调队列)

    好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...

随机推荐

  1. 三、Spring Boot 日志

    1.日志框架 小张:开发一个大型系统: 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? 2.框架来记录系统的一些运行时信息:日志框架 ...

  2. 关系型数据库与NoSQL数据库的优劣

    当大家学习了一定的NoSQL知识以后,了解了现今许多NoSQL数据库(如HBase,MongoDB,Redis等)时,就会觉得关系型数据库可能已经跟不上时代的步伐.其实并不然,关系型数据库的性能绝对不 ...

  3. 移动端rem布局(阿里)

    该方案使用相当简单,把下面这段已压缩过的 原生JS(源码已在文章底部更新,2017/5/3) 放到 HTML 的 head 标签中即可(注:不要手动设置viewport,该方案自动帮你设置) < ...

  4. 深入SQL Server优化【推荐】

    深入sql server优化,MSSQL优化,T-SQL优化,查询优化 十步优化SQL Server 中的数据访问故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性 ...

  5. svn 客户端安装 windows

    windows使用的 https://tortoisesvn.net/ 下载中文语言包 安装 安装完安装语言包 看到这个代表svn客户端可以用了 windows客户端下载TortoiseSVN软件进行 ...

  6. 014-并发编程-java.util.concurrent之-CountDownLatch

    一.概述 CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,指定的一个或多个线程等待其他线程执行完成后执行. 能够使一个线程等待其他线程完成各自的工 ...

  7. FCN-全卷积网络

    全卷积网络 Fully Convolutional Networks CNN 与 FCN 通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定 ...

  8. Build a Basic CRUD App with Vue.js and nodejs

    https://developer.okta.com/blog/2018/02/15/build-crud-app-vuejs-node#add-authentication-with-okta I’ ...

  9. Oracle SQL常用语句

    1,查询插入 insert into user_role(account_id, role_id, create_user) select t.employee_id, 'BC8FBF8B1D9843 ...

  10. gluster 卷的类型及创建方法

    基本卷: 分布式卷 文件随机分布在brick中,提升读写性能 不提供数据冗余,最大化利用磁盘空间 # gluster volume create test-volume server1:/exp1 s ...