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

/*
给定一棵树,树节点可以染黑白,要求叶子节点黑白平分
称连接黑白点的边为杂边,求使得杂边最少的染色方
那么设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. 课程9:《hibernate框架开发2016版视频》视频目录

    \第1天\视频\01_今天内容介绍.avi; \第1天\视频\02_web内容回顾.avi; \第1天\视频\03_hibernate框架概述.avi; \第1天\视频\04_什么是orm思想.avi ...

  2. VMware 11安装Mac和Linux

    VMware 11安装Mac OS X 10.10_百度经验 https://jingyan.baidu.com/article/ff411625b9011212e48237b4.html?qq-pf ...

  3. 不使用setCustomView,设置ActionBar标题居中

    仅供参考,有太多自定义标题栏需求时,还是建议使用setCustomView https://blog.csdn.net/chiceT/article/details/50455358

  4. TPU使用说明

    1 TPU分类和收费标准 1.1 分类和计费说明 地区 抢占式TPU Cloud TPU 美国 $1.35/hour $4.5/hour 欧洲 $1.485/hour $4.95/hour 亚太区地区 ...

  5. pythonのgevent同步异步区别

    #!/usr/bin/env python from urllib import request import gevent from gevent import monkey import time ...

  6. PF部分代码解读

    // 单个粒子数据结构 typedef struct { // 粒子状态 pf_vector_t pose; // 粒子权重 double weight; } pf_sample_t; // Info ...

  7. 【转】MySQL-Select语句高级应用

    [转]MySQL-Select语句高级应用 1.1 SELECT高级应用 1.1.1 前期准备工作 本次测试使用的是world数据库,由mysql官方提供下载地址: https://dev.mysql ...

  8. 在Linux下误删文件后恢复【转】

    针对日常维护操作,难免会出现文件误删除的操作.大家熟知linux文件系统不同win有回收站,删除后的文件可以到垃圾箱寻回,要知道linux文件修复比较费劲,网络上面的文档也是五花八门.所以本次研究一种 ...

  9. Python运维开发基础09-函数基础【转】

    上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...

  10. JavaScript数组去重—ES6的两种方式

    说明 JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript 数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种方法,代 ...