HDU 4340
好题一道啦。做这题时,抓住两个问题:一、给某点染色时,其连通的点是否已有一点以全部代价染色。二、该点染什么颜色。
嗯。第二个问题很容易,但第一个问题不容易了。我一开始就考虑祖父子三层结点的关系,认为在父结点时,要么子结点已染色,要么父结点已染色%#……*&¥%#……
很复杂。。。。
这是条件定得过于严格了,所以走不通。看了题解后,发现,可以把状态条件设得宽一点。
设dp[rt][0][0]为以rt为根的子树内,rt染0颜色,与其连通的块(同色,在子树内的)中,没有一个节点是以全部代价染色的,即没有入口点。
dp[rt][0][1]则为以rt为根的子树内,rt染0颜色,与其连通的块(同色,在子树内的)中,存在一个节点是以全部代价染色的。感觉这个存在实现设得妙,只要存在就可以,条件放宽了许多。
对于dp[r][1][0],dp[r][1][1]有同样的定义。
于是dp[rt][0][0]=sum(min(dp[son][0][0],dp[son][1][1]))+costrt/2;
dp[rt][0][1]=sum(min(dp[son][0][0],dp[son][1][1]))+min(costrt,costrt/2+min(dp[son][0][1]-min(dp[son][0][0],dp[son][1][1]))).解释一下min(dp[son][0][1]-min(dp[son][0][0],dp[son][1][1])。这是把子结点以根的子树状态转化为dp[rt][0][1]的最小代价,其中min(dp[son][0][0],dp[son][1][1])与方程开始的min(dp[son][0][0],dp[son][1][1])是一致的,因而又是一个巧妙的地方。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#define N 110 using namespace std;
int costA[N],costB[N]; int dp[N][][]; struct edge{
int u,v;
int next;
}Edge[N*];
int n,tot;
int head[N]; void addedge(int u,int v){
Edge[tot].u=u;
Edge[tot].v=v;
Edge[tot].next=head[u];
head[u]=tot++;
} void dfs(int now,int pre){
bool leaf=true;
int sum0=,sum1=;
int CA=(<<),CB=(<<);
for(int e=head[now];e!=-;e=Edge[e].next){
int v=Edge[e].v;
if(v!=pre){
leaf=false;
dfs(v,now);
sum0+=min(dp[v][][],dp[v][][]);
sum1+=min(dp[v][][],dp[v][][]);
CA=min(CA,dp[v][][]-min(dp[v][][],dp[v][][])+costA[now]/);
CB=min(CB,dp[v][][]-min(dp[v][][],dp[v][][])+costB[now]/);
}
}
if(leaf){
dp[now][][]=costA[now]/;
dp[now][][]=costA[now];
dp[now][][]=costB[now]/;
dp[now][][]=costB[now];
}
else{
dp[now][][]=sum0+costA[now]/;
dp[now][][]=sum0+min(costA[now],CA);
dp[now][][]=sum1+costB[now]/;
dp[now][][]=sum1+min(costB[now],CB);
}
} int main(){
int u,v;
while(scanf("%d",&n)!=EOF){
tot=;
memset(head,-,sizeof(head));
for(int i=;i<=n;i++)
scanf("%d",&costA[i]);
for(int i=;i<=n;i++)
scanf("%d",&costB[i]);
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
dfs(,);
printf("%d\n",min(dp[][][],dp[][][]));
}
return ;
}
HDU 4340的更多相关文章
- hdu 4340 树状DP
思路:我们定义两个数组,ant[Maxn][2],bob[Maxn][2].ant[i][0]表示还未确定哪个城市被全费用占领,ant[i][1]表示确定了哪个城市被全费用占领.那么ant[i][0] ...
- 【HDU - 4340】Capturing a country(树形DP)
BUPT2017 wintertraining(15) #8A 题意 n(<100)个城市组成的树.A攻击i城市需要a[i]代价,B需要b[i].如果一个城市的邻居被A攻击了,那么A攻击它只要A ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
随机推荐
- chromium添加flash
http://blog.csdn.net/lainegates/article/details/27830333
- 转载【H:JL】用大家的力量来总结一个目录(众人拾柴火焰高)
博客地址:http://www.cnblogs.com/HJL-Blog/p/4459245.html
- @synthesize和@dynamic区别
在声明property属性后,有2种实现选择 @synthesize 编译器期间,让编译器自动生成getter/setter方法. 当有自定义的存或取方法时,自定义会屏蔽自动生成该方法 @dynami ...
- Windows下Python + AutoCAD 多义线绘图小结
简介 在windows下台下, 使用comtypes库, 通过ActiveX操作autocad, 从而读取AutoCAD数据 comtypes.client AutoCAD ActiveX GetAc ...
- ManualResetEvent和AutoResetEvent的区别,分享来的
在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...
- Win8.1应用开发之适配器模式(C#实现)
实际上适配器模式是用于解耦.设想一下我们的程序模块A在与模块B打交道时,需要在许多地方多次使用B中某个类的方法,而负责开发B的程序猿Tom还未完全实现该类,会随时更改该类中的方法,那么当Tom在修改时 ...
- UWP Ad
1.对于 UWP 应用:使用 Visual Studio 2015 安装 Microsoft Store Services SDK 2.对于通用 Windows 平台 (UWP) 项目:展开通用 Wi ...
- 0xc000007b:vs2012+Opencv2.4.4出现"0xc000007b"问题
在64位系统中,VS2012+opencv2.4.4下编程出现一个问题,我简单的读取图片就出现"应用程序无法正常启动0xc000007b"的问题:如图: 注意事项:把运行环境改成 ...
- python版本及ML库
一:关于Python版本的选择问题 关于Python的选择问题:要看学术界能不能把科学库迁移到Python3. 1:多个版本共用: 最近发现SciPy的最高版本是3.2,只能是退而求其次,不使用最新版 ...
- css—各浏览器下的背景色渐变
.linear{ width:100%; height:600px; FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0 ...