BUPT2017 wintertraining(15) #8A

题意

n(<100)个城市组成的树。A攻击i城市需要a[i]代价,B需要b[i]。如果一个城市的邻居被A攻击了,那么A攻击它只要A[i]/2(整除)的代价,B同理。求攻击全部城市的最小代价。

题解

这题很容易想到树形dp。

每个节点为根的子树,有可能是:

A从根的上面攻击下来,

A从根或下面攻击到根上面,

B从根的上面攻击下来,

B从根或下面攻击到根上面。

于是设计状态

dp[i][0..1][0..1]分别对应i为根的子树上面四种状态下攻击整个子树的最小代价。

然后dfs,在回溯的时候进行状态转移。

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 105
#define inf 0x3f3f3f3f
struct edge{
int to,next;
}e[N<<1];
int head[N],cnt;
void add(int u,int v){
e[++cnt]=(edge){v, head[u]};
head[u]=cnt;
}
int a[N],b[N];
int dp[N][2][2];
int f[N][2];
void dfs(int x, int fa){
//ha:先用A攻击x,再攻击它子树的最少花费
int ha=0,hb=0;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(v==fa)continue;
dfs(v,x);
//如果A攻击了x,儿子i为根的子树的最小花费就是min(A下去攻击i,或者B攻上来到i)。
ha+=min(dp[v][0][0],dp[v][1][1]);
hb+=min(dp[v][1][0],dp[v][0][1]);
f[x][0]=min(f[x][0],f[v][0]);//f[i][0]:min(A先攻击i的某个子节点-不用A先攻击该子节点),就是最小的增加量。
f[x][1]=min(f[x][1],f[v][1]);
}
dp[x][0][0]=ha+a[x]/2;
dp[x][1][0]=hb+b[x]/2; //x的儿子里选一个先攻击,就要加上f[x][0]+a[x]/2(半价攻击x)
//先攻击x,就要加上a[x](全价攻击x)
dp[x][0][1]=ha+min(f[x][0]+a[x]/2, a[x]);
dp[x][1][1]=hb+min(f[x][1]+b[x]/2, b[x]);
//如果选择不用A从下往上攻击x节点,我们肯定要选其它方案里花费最小的一种。所以取min。
f[x][0]=dp[x][0][1]-min(dp[x][0][0], dp[x][1][1]);
f[x][1]=dp[x][1][1]-min(dp[x][1][0], dp[x][0][1]);
}
int n;
void init(){
cnt=0;
memset(head, 0,sizeof head);
memset(dp, 0, sizeof dp);
memset(f, inf, sizeof f);
}
void work(){
for(int i=1;i<=n;++i)
scanf("%d",a+i);
for(int i=1;i<=n;++i)
scanf("%d",b+i);
for(int i=1,x,y;i<n;++i)
scanf("%d%d",&x,&y),add(x,y),add(y,x);
dfs(1,0);
printf("%d\n",min(dp[1][1][1], dp[1][0][1]));
}
int main(){
while(~scanf("%d", &n)){
init();
work();
}
}

ps.这题四个月前补过一次,今天又不会了。花了好久才明白。主要是状态的设计和转移。我觉得我这种转移写法也许算是比较难理解和直接写出来的,我当时是参考了别的题解再改了改。

【HDU - 4340】Capturing a country(树形DP)的更多相关文章

  1. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  2. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

  3. HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...

  4. hdu 4003 Find Metal Mineral 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...

  5. HDU 5758 Explorer Bo(树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5758 [题目大意] 给出一棵树,每条路长度为1,允许从一个节点传送到任意一个节点,现在要求在传送次 ...

  6. 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】

    Colorful Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  7. HDU 4123 Bob’s Race 树形dp+单调队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...

  8. HDU 1011 Starship Troopers【树形DP/有依赖的01背包】

    You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...

  9. HDU 4799 LIKE vs CANDLE 树形dp

    题意:有n个人,他们的关系,形成一棵有根树(0是树根,代表管理员),每个人有一个价值 现在有一条微博,每个人要么点赞,要么送一个蜡烛 初始一些人利用bug反转了某些人的操作(赞变蜡烛 或者 蜡烛变成赞 ...

  10. hdu 3586 Information Disturbing(树形dp + 二分)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:   hdu-3586 题意 给一棵n个节点的树,节点编号为1-n,根节点为1.每条边有权值,砍掉一条边要花费 ...

随机推荐

  1. Python中IO概述

    Python中的io模块是用来处理各种类型的I/O操作流.主要有三种类型的I/O类型:文本I/O(Text I/O),二进制I/O(Binary I/O)和原始I/O(Raw I/O).它们都是通用类 ...

  2. Python-面向对象简介

    面向对象介绍 学习面向对象过程中会遇到一些名词,我们先解释下 名词解释 类:一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.模板.在类中定义了这些对象的都具备的属性(variables(data ...

  3. java总结:Java中获取系统时间(年、月、日)以及下拉菜单默认选择系统年、月、日的方法

    <!-- 获取系统当前的年.月.日 --> <%@ page import="java.util.*"%> <% Calendar calendar= ...

  4. centos 7 aufs

    Docker storage drivers | Docker Documentationhttps://docs.docker.com/storage/storagedriver/select-st ...

  5. 前端三大框架Angular & React & Vue

    前端三大框架: Angular[Google]:一套框架,多种平台移动端 & 桌面端.学会用Angular构建应用,然后把这些代码和能力复用在多种多种不同平台的应用上 —— Web.移动 We ...

  6. c#+linux+mono+Redis集群(解决无法连接Redis的问题)

    在linux环境中使用mono来执行c#的程序, 在连接redis的时候遇到了无法连接数据库的错误.如下: Unhandled Exception:StackExchange.Redis.RedisC ...

  7. ssh登录

    ssh 用户名@IP地址 -p 端口号 ssh root@127.0.0.1 -p 2222

  8. PHP中对象的深拷贝与浅拷贝

    先说一下深拷贝和浅拷贝通俗理解 深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个 浅拷贝:赋值时,引用赋值,相当于取了一个别名.对其中一个修改,会影响另一个 PHP中, = ...

  9. [转帖]cmd批处理常用符号详解

    cmd批处理常用符号详解 https://www.jb51.net/article/32866.htm 很多符号 还是不清楚的.. 批处理能够极大的提高 工作效率 需要加强深入学习.   1.@一般在 ...

  10. MyBatis映射文件4(参数获取#{}和${}/select标签详解[返回类型为list])

    参数获取 之前我们都是采用#{}的方式进行参数传递,其实MyBatis还有另外的参数传递方式${} 使用方法相同,但是还是有很大区别的 这里做一个测试: <select id="get ...