题意 给了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. 4QC(四象限变流器)

    1.什么是4QC? 4QC又叫四象限整流器 它是全控型晶闸管的整流电路,现在一般用水冷的IGBT组成的整流电路,它可以调节电压和电流,所谓的四象限就是 u+,i+,为第一象限: u-,i+.,为第二象 ...

  2. day2_Jmeter压测

    1.线程组各项设置的意思 2.压测结果查看各指标意思 备注:tps:每秒钟系统能够处理的交易或事务的数量.它是衡量系统处理能力的重要指标.tps越高说明服务器处理能力越好. 3.在一台电脑上做一个简单 ...

  3. RHEL6.2的安装文档

    1 Installing RHEL 6.2 1.1 开始安装 选择“Install or upgrade an existing system”: 1.2 光盘检测 选择“Skip”跳过安装介质的检查 ...

  4. kubernetes的apiserver

    1. API Server简介 k8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心. ...

  5. 洛谷P4562 [JXOI2018]游戏 数论

    正解:数论 解题报告: 传送门! 首先考虑怎么样的数可能出现在t(i)那个位置上?显然是[l,r]中所有无法被表示出来的数(就约数不在[l,r]内的数嘛QwQ 所以可以先把这些数筛出来 具体怎么筛的话 ...

  6. 洛谷P3242 接水果 [HNOI2015] 整体二分

    正解:整体二分+树状数组 解题报告: 传送门! 题目还是大概解释下?虽然其实是看得懂的来着,,, 大概就是说给一棵树.给定一些询问,每个询问都是说在两个点之间的路径上的子路径的第k大是什么 然后看到这 ...

  7. linux 内核启动流程分析,移植

    分析 linux-2.6.22.6 内核启动流程 移植 linux-3.4.2 到 JZ2440 开发板 Linux内核源码百度云链接: https://pan.baidu.com/s/1m1ymGl ...

  8. IntelliJ IDEA Ultimate 下载与安装

    一.下载 Intellij IDEA Ultimate 下载链接:https://www.jetbrains.com/idea/download/#section=windows 1.进入官网点击Ul ...

  9. Postman教程

    1.Postman的介绍 Postman是一款功能强大的用于发送 HTTP 请求的 Chrome插件 .做web页面开发和测试的人员应该都知道!其主要特点:创建 + 测试:创建和发送任何的HTTP请求 ...

  10. 010-java 表单方式或者base64方式上传图片,后端使用nutz的post转发图片到另一个请求

    本地上传图片 方式一.使用表单方式上传-enctype <form enctype="multipart/form-data" method="post" ...