这道题的难点其实是在设DP方程,见过就应该会了

令f0,i表示先激发i的父亲,再激发i,把i的整棵子树都激发的最小费用

f1,i表示先激发i,再激发i的父亲,把i的整棵子树都激发的最小费用

设x,y为i的孩子,先激发x再激发i再激发y有

f0,i=∑(f1,y-cy)+∑f0,x+di-cfa

f1,i=∑(f1,y-cy)+∑f0,x+di

其中差的只有cfa,即0<=f1,i-f0,i<=1,对于typeA就容易做了,若两者相等就选f1,它可以消父亲,否则选f0,因为父亲消的次数有限,而即使消了也只是和选f0得到相同的结果

对于TypeB做树上背包,Fi,j表示第i个点,孩子节点给它贡献了j的最小费用,更新f0,f1

我码力太弱了。。在判断i是否已经被全部消完的时候f0和1要分开判。。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std; struct node
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
} int n,d[],c[]; bool type;
int f[][],F[][],li[],t[];
void dfs(int x,int fr)
{
if(type==false)
{
f[][x]=max(d[x]-c[fr],);
f[][x]=d[x];
}
else F[x][]=;
int sumc=;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=fr)
{
dfs(y,x);sumc+=c[y];
if(type==false)
{
if(f[][y]==f[][y])
{
f[][x]+=f[][y]-c[y]*((d[x]-c[fr])>=c[y]);
f[][x]+=f[][y]-c[y]*(d[x]>=c[y]);
d[x]-=c[y];
}
else
f[][x]+=f[][y], f[][x]+=f[][y];
}
else
{
memset(t,,sizeof(t));
for(int i=min(sumc,li[x]);i>=;i--)t[i]=F[x][i]+f[][y];
for(int i=min(sumc,li[x]);i>=;i--)
{
int u=min(sumc,i+c[y]);
if(i+c[y]>li[x])t[u]=min(t[u],F[x][i]+f[][y]);
else t[u]=min(F[x][u]+f[][y],F[x][i]+f[][y]);
}
memcpy(F[x],t,sizeof(F[x]));
li[x]+=c[y];
}
}
}
if(type==true)
{
for(int i=min(sumc,li[x]);i>=;i--)
{
f[][x]=min(f[][x],F[x][i]+max(d[x]-i-c[fr],));
f[][x]=min(f[][x],F[x][i]+max(d[x]-i,));
}
}
} int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&d[i]);
type=false;
for(int i=;i<=n;i++)
scanf("%d",&c[i]),type|=(c[i]>); int x,y;
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
ins(x,y),ins(y,x);
}
memset(f,,sizeof(f));
memset(F,,sizeof(F));
dfs(,);
printf("%d\n",f[][]); return ;
}

最新文章

  1. js 自动插入分号
  2. Verilog学习笔记认识提升篇(一)...............时序的基本概念(待补充)
  3. &lt;a&gt;标签跳转传值。
  4. spring ext 跨域
  5. union select
  6. Git 升级与基础适用
  7. sys.path和os.path
  8. c#中的委托和事件(转)
  9. 【Unity3D基础教程】给初学者看的Unity教程(七):在Unity中构建健壮的单例模式(Singleton)
  10. Java浮点值拒绝服务漏洞危害分析
  11. 面试题总结之C/C++/MISC
  12. Java基础知识强化39:StringBuffer类之StringBuffer的删除功能
  13. Cloudera Manager Free Edition 4.1 和CDH 4.1.2 简易安装教学
  14. Visual Studio中开发
  15. Binary Tree Inorder Traversal(转)
  16. [修]python普通继承方式和super继承方式
  17. 16.如何做到webpack打包vue项目后,可以修改配置文件
  18. 本地工程引入maven工程的配置方式
  19. idhttp提交post带参数并带上cookie
  20. Maven的简单使用

热门文章

  1. python3 时间复杂度
  2. Laya 项目解耦
  3. POJ-2689 Prime Distance,区间素数筛法
  4. Linux基础之vi编辑器(二)
  5. POJ 2288 汉密尔顿回路 DP解决
  6. 安卓巴士Android开发神贴整理
  7. hdu6110:路径交
  8. iOS present出一个背景为半透明的试图
  9. openstack swift middleware开发
  10. Windows平台下Git(gitblit)服务器搭建