HDU 4340 Capturing country(树状DP)
来源:互联网 发布:飞控电子显示屏软件 编辑:程序博客网 时间:2024/06/07 03:45
题目大意:
Ant和Bob两只军队要去虏获一个国家,国家中包含了N个城市。
A[j]代表Ant军队攻占city i需要A[I]分钟,同理B[i];
然后同一军队攻占连在一条线上city的时候比如说city j,则只需要A[j]/2;
输出:攻占国家所需的最少时间
题目思路:
用树状DP
dp[i][j][k]=
{
i:当前城市;
j:0为当前城市由Ant军队占领,1为Bob军队占领;
k:0为该条线上全部都为一半花费,1为该条线上存在至少一个付全费city;
}
叶节点的值为
{
dp[u][0][0]=A[I]/2;
dp[u][1][0]=B[I]/2;
dp[u][0][1]=A[I];
dp[u][1][1]=B[I];
}
对于dp[i][0][0]
{
设根节点为u,子节点为v.
初始化dp[u][0][0]=A[u]/2;
若v被Ant占领,则有:dp[u][0][0]+=dp[v][0][0];
若v被Bob占领,则有:dp[u][0][0]+=dp[v][1][1];
所以由此可得转移方程:dp[u][0][0]+=min{dp[v][0][0],dp[v][1][1]};
同理:dp[u][1][0]+=min{dp[v][0][1],dp[v][1][0];
}
对于dp[i][0][1],分两种情况:
(1)在当前点全花费时
(2)在子孙中全花费
{
设根节点为u,子节点为v;
(1)
初始化dp[u][0][1]=A[u];
若v被Ant占领,则有:dp[u][0][1]+=dp[v][0][0];
若v被Bob占领,则有:dp[u][0][1]+=dp[v][1][1];
由此可得转移方程:dp[u][0][1]+=min{dp[v][0][0],dp[v][1][1]};
同理:dp[u][1][1]+=min{dp[v][0][1],dp[v][1][0]};
(2)
初始化dp[u][0][1]=A[u]/2;
此时,要先求出其中最小的dp[v][0][1]-min(dp[v][0][0],dp[v][1][1]),记为ga(ga可能为负)
然后用dp[u][0][1]+=min{dp[v][0][0],dp[v][1][1]},求出到根节点的全部只用半花费的值,记为sa;
由此可得转移方程:dp[u][0][1]+=ga+sa;
同理,可以求出dp[u][1][1];
最后处理:
答案转移到dp[1][1][1]或者dp[1][0][1]中,取min{dp[1][1][1],dp[1][0][1]}即可得到答案
}
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>using namespace std;#define min(a,b) a<b?a:b#define N 110#define INF 0x7FFFFFFint atime[N],btime[N];vector<int>g[N];int dp[N][2][2];void dfs(int u,int pre){ if( g[u].size()==1 && pre!=-1 ) { dp[u][0][0] = (atime[u]>>1); dp[u][1][0] = (btime[u]>>1); dp[u][0][1] = atime[u]; dp[u][1][1] = btime[u]; return ; } int ga=INF,gb=INF; int sa=0,sb=0; for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(v==pre) continue; dfs(v,u); int m1=min(dp[v][0][0],dp[v][1][1]); int m2=min(dp[v][0][1],dp[v][1][0]); sa += m1; sb += m2; ga = min(ga,dp[v][0][1]-m1); gb = min(gb,dp[v][1][1]-m2); } dp[u][0][0] = sa + (atime[u]>>1); dp[u][1][0] = sb + (btime[u]>>1); dp[u][0][1] = min(sa + atime[u],ga+sa+(atime[u]>>1)); dp[u][1][1] = min(sb + btime[u],gb+sb+(btime[u]>>1));}int main(){ int i,j,n,u,v; while(scanf("%d",&n)!=EOF) { for(i=0;i<=n;i++) g[i].clear(); for(i=1;i<=n;i++) scanf("%d",&atime[i]); for(i=1;i<=n;i++) scanf("%d",&btime[i]); for(i=1;i<n;i++) { scanf("%d%d",&u,&v); g[u].push_back(v); g[v].push_back(u); } dfs(1,-1); printf("%d\n",min(dp[1][0][1],dp[1][1][1])); } return 0;}
- HDU 4340 Capturing country(树状DP)
- hdu - 4340 - Capturing a country - 树形dp
- HDU 4340 Capturing a country 树形DP
- HDU 4340 Capturing a country(树形DP)
- HDU4340 Capturing a country 树状DP经典
- hdu 4340 Capturing a country
- hdu 4340 Capturing a country
- HDU 4340 Capturing a country ()
- hdu 4340 Capturing a country(树形DP) 2012 Multi-University Training Contest 5
- BNU 0808-A. Capturing a country [HDU 4340]
- 【树形DP】 hdu4340 Capturing a country
- HDU4340 Capturing a country 树形dp
- HDU 4340 Capturing a country 2012 Multi-University Training Contest 5
- HDU 5723 Abandoned country(最小生成树 + 树形DP)
- hdu 2196 computer (树状DP+dfs)
- HDU 1520 Anniversary party (树状dp)
- HDU 4035 Maze (树状dp + 概率)
- hdu 4991(dp+树状数组)
- 项目日记_springMVC 学习杂记 4
- MongoDB之旅(一)简介
- 服务进程创建一个带窗口的进程,过UAC
- 改变需要从现在做起
- 有意识锻炼语言表达能力。
- HDU 4340 Capturing country(树状DP)
- 【CSS】瀑布流布局的两种方式:传统多列浮动和绝对定位布局
- 多线程并发 synchronized对象锁的控制与优化
- 配置Oracle网络环境
- photoshop 教程
- Tomcat default servlet
- 基于 Annotation 拦截的 Spring AOP 权限验证方法
- 学历不等于能力,肯做事不等于会做事
- 暑期训练个人小结 byPlato