【HDU - 4340】Capturing a country(树形DP)
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)的更多相关文章
- hdu 4514 并查集+树形dp
		
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
 - [HDU 5293]Tree chain problem(树形dp+树链剖分)
		
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
 - HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
		
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
 - hdu 4003 Find Metal Mineral 树形DP
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...
 - HDU 5758 Explorer Bo(树形DP)
		
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5758 [题目大意] 给出一棵树,每条路长度为1,允许从一个节点传送到任意一个节点,现在要求在传送次 ...
 - 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 ...
 - HDU 4123 Bob’s Race 树形dp+单调队列
		
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...
 - 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 ...
 - HDU 4799 LIKE vs CANDLE 树形dp
		
题意:有n个人,他们的关系,形成一棵有根树(0是树根,代表管理员),每个人有一个价值 现在有一条微博,每个人要么点赞,要么送一个蜡烛 初始一些人利用bug反转了某些人的操作(赞变蜡烛 或者 蜡烛变成赞 ...
 - hdu 3586 Information Disturbing(树形dp + 二分)
		
本文出自 http://blog.csdn.net/shuangde800 题目链接: hdu-3586 题意 给一棵n个节点的树,节点编号为1-n,根节点为1.每条边有权值,砍掉一条边要花费 ...
 
随机推荐
- Python—time模块介绍
			
time 模块 在平常的代码中,我们常常需要与时间打交道.在Python中,常用的与时间处理有关的模块就包括:time,datetime,下面来介绍time模块. 在开始之前,首先要说明几点: 一.在 ...
 - dfs实现数的全排列
			
代码 #include<bits/stdc++.h> using namespace std; #define ll long long bool vis[15]; int a[15]; ...
 - Python学习第九篇——while和for的区别
			
pets = ['dog','cat','dog','goldfish','cat','rabbit','cat'] print(pets) for pet in pets: print(pet) # ...
 - oc之证书
			
https://www.cnblogs.com/MrJalen/p/6813309.html iOS推送证书生成pem文件(详细步骤) 1.pem文件概述 pem文件是服务器向苹果服务器做推送时候 ...
 - [2017BUAA软工助教]常见问题Q&A
			
软工常见问题Q&A 目录: 1. 转会相关 1.1 转会流程是什么样子的? 1.2 团队中多人要求转会怎么办?(如何解散团队) 1.3 为什么有人想要转会? 1.4 软件工程课为什么有这一环节 ...
 - jvisualvm远程监控 visualgc插件 不受此jvm支持问题
			
https://yq.aliyun.com/ziliao/478212 1.修改远程服务器上java设置 vi $JAVA_HOME/jre/lib/security/java.policy 在 ...
 - md5加密通过URL传给后台
			
首先要把你要用的md5库引入 这个技术其实挺简单的,咋们直接贴上代码(这个是项目上的) sign = hex_md5("type="+type&"userId=& ...
 - asp.net core2.0中异常的处理
			
最近在开发中遇到一些关于如何抛出异常的困惑,在qq群里进行了讨论,有些人认为抛出异常是有理由的,可以对业务流程进行控制,而有些认为抛出异常会导致程序性能低下,我写一些自己的心得吧. 异常的全局处理 a ...
 - 【面试】MySQL的事务和索引
			
MySQL事务 MySQL事务主要用于处理操作量大,复杂度高的数据. 比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这些数据库操作 ...
 - 日期选择器date、week、time、datetime、datetime-local类型
			
下面只写两个类型的代码案例,其他都大同小异 date类型: <!DOCTYPE html> <html> <head> <meta charset=" ...