这题得加个临时数组才能做。。

/*
给定一棵树,树节点可以染黑白,要求叶子节点黑白平分
称连接黑白点的边为杂边,求使得杂边最少的染色方
那么设dp[i][j][0|1]表示i子树中有j个叶子节点,i染黑或白
那么其实是依赖背包,即枚举每个节点的字数v,进行分组即可
给dp初始化0x3f
边际条件:如果i是叶子节点,那么dp[i][i][0|1]=0;
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 5005
struct Edge{int to,nxt;}edge[maxn<<];
int n,k,flag[maxn],num[maxn],root,dp[maxn][maxn][],tot,head[maxn];
void init(){
memset(head,-,sizeof head);
tot++;
}
void addedge(int u,int v){
edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++;
}
int dfs1(int u,int pre){
num[u]=;
if(flag[u]==)return num[u]=;
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v!=pre)dfs1(v,u),num[u]+=num[v];
}
return num[u];
}
void dfs2(int u,int pre){
if(flag[u]==){
dp[u][][]=dp[u][][]=;
return;
} for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v!=pre)dfs2(v,u);
} int tmp[maxn][];//临时数组,tmp[j]表示j个黑点的最小杂边
dp[u][][]=dp[u][][]=;//这两种情况
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v==pre)continue; memset(tmp,0x3f,sizeof tmp); for(int j=num[u];j>=;j--)
for(int t=num[v];t>=;t--){
tmp[j][]=min(tmp[j][],dp[u][j-t][]+min(dp[v][t][],dp[v][t][]+));
tmp[j][]=min(tmp[j][],dp[u][j-t][]+min(dp[v][t][],dp[v][t][]+));
} for(int j=num[u];j>=;j--)//每次更新完一次tmp数组都要更新到dp里
dp[u][j][]=tmp[j][],dp[u][j][]=tmp[j][];
} }
int main(){
cin>>n;
int u,v;init();
for(int i=;i<n;i++){
cin>>u>>v;
addedge(u,v);addedge(v,u);
flag[u]++,flag[v]++;
}
if(n==){
printf("%d\n",n-);
return ;
} memset(dp,0x3f,sizeof dp);
root=;
while(flag[root]==)root++;
dfs1(root,);
k=num[root]/;
dfs2(root,);
printf("%d\n",min(dp[root][k][],dp[root][k][]));
}

cf581F 依赖背包+临时数组 好题的更多相关文章

  1. 依赖背包——cf855C好题

    比较裸的依赖背包,但是想状态还是想了好久 转移时由于边界问题,虽然可以倒序转移,但当容量为0|1的时候,由于有初始值的存在 很难再原dp数组上进行修改,所以额外用tmp数组来保存修改后的值 #incl ...

  2. BZOJ.4182.Shopping(点分治/dsu on tree 树形依赖背包 多重背包 单调队列)

    BZOJ 题目的限制即:给定一棵树,只能任选一个连通块然后做背包,且每个点上的物品至少取一个.求花费为\(m\)时最大价值. 令\(f[i][j]\)表示在点\(i\),已用体积为\(j\)的最大价值 ...

  3. 依赖背包优化——ural1018,金明的预算方案

    经典题了,网上博客一大堆O(nCC)的做法,其实是可以将复杂度降到O(nC)的 参考依赖背包优化(泛化物品的并) 根据背包九讲,求两个泛化物品的和复杂度是O(CC)的,所以依赖背包暴力求解的复杂度是O ...

  4. 【HDU 4276】The Ghost Blows Light(树形DP,依赖背包)

    The Ghost Blows Light Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The t ...

  5. hdu 1561 The more, The Better (依赖背包 树形dp)

    题目: 链接:点击打开链接 题意: 非常明显的依赖背包. 思路: dp[i][j]表示以i为根结点时攻击j个城堡得到的最大值.(以i为根的子树选择j个点所能达到的最优值) dp[root][j] = ...

  6. hdoj1010Starship Troopers (树dp,依赖背包)

    称号:hdoj1010Starship Troopers 题意:有一个军队n个人要占据m个城市,每一个城市有cap的驻扎兵力和val的珠宝,并且这m个城市的占率先后具有依赖关系,军队的每一个人能够打败 ...

  7. BZOJ.4910.[SDOI2017]苹果树(树形依赖背包 DP 单调队列)

    BZOJ 洛谷 \(shadowice\)已经把他的思路说的很清楚了,可以先看一下会更好理解? 这篇主要是对\(Claris\)题解的简单说明.与\(shadowice\)的做法还是有差异的(比如并没 ...

  8. bzoj4753: [Jsoi2016]最佳团体(分数规划+树形依赖背包)

    菜菜推荐的“水题”虐了我一天T T...(菜菜好强强qwq~ 显然是个分数规划题,二分答案算出p[i]-mid*s[i]之后在树上跑依赖背包,选k个最大值如果>0说明还有更优解. 第一次接触树形 ...

  9. Gym - 100502G Outing (强连通缩点+树形依赖背包)

    题目链接 问题:有n个人,最多选k个,如果选了某个人就必须选他指定的另一个人,问最多能选多少个人. 将每个人所指定的人向他连一条单向边,则每一个点都有唯一的前驱,形成的图是个基环树森林,在同一个强连通 ...

随机推荐

  1. HDFS笔记(一)

    1. HDFS 是什么? Hadoop分布式文件系统(Distributed File System)-HDFS(Hadoop Distributed File System) 2. HDFS 架构 ...

  2. 20165221—JAVA第六周学习心得

    课本知识点小结 第8章:常用实用类 String类 常量对象放入常量池中,而用string声明的对象变量中存放着引用.凡是new构造的常量都不在常量池中. startIndex表示提取字符的起始位置, ...

  3. GridView item设置点击背景

    GridView item设置点击背景 android:listSelector="@android:color/transparent"

  4. Mysql多实例安装笔记

    参考: 系统:KaliLinux (x86_64) 软件下载 1.下载地址: 2.选择5.6版本 安装 1.准备文件和目录 tar -zxvf mysql-5.6.40-linux-glibc2.12 ...

  5. ASP.NET Core中使用Autofac

    ⒈添加相关依赖 Install-Package Autofac ⒉扫描项目接口实现类 using Autofac; using System; using System.Collections.Gen ...

  6. Git使用手册【转】

    转自:https://www.jianshu.com/p/e32a8e7ca93b 目录: Git是什么 基本概念 Git的诞生 Git的安装与配置 创建版本库 Git操作略览 远程仓库:git的杀招 ...

  7. linux添加swap分区【转】

    概述 添加交换分区主要是因为安装oracle时碰到交换分区太小时无法安装的情况,这时候就需要添加交换分区了. 操作简介 增加swap分区方法: 1.新建磁盘分区作为swap分区 2.用文件作为swap ...

  8. 从运维角度来分析mysql数据库优化的一些关键点【转】

    概述 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分 ...

  9. Vue父子组件和非父子组件传值问题

    父组件跟子组件之间的传值(具体参考lonzhubb商城) 1.父组件传值给子组件形式,ifshop是要传的对象,右边ifshop代表要传的这个对象的数据,如果只是传常量,那么属性可以不用加':'(表示 ...

  10. vs 快捷键操作

    各个版本可能不同,以vs 2013为例. 1.调试时,调出即时窗口:[Ctrl+Alt+i] 2.注释/取消注释:[Ctrl+K Ctrl+C]/[Ctrl+K Ctrl+U]