当前位置: 首页 > news >正文

[2019.2.28]BZOJ4033 [HAOI2015]树上染色

首先我们设\(dp_{i,j}\)表示\(i\)和的子树中,有\(j\)个黑色节点的最大边权和。

我们设\(i\)当前已合并的子树大小为\(sz_i\)

现在我们要合并节点\(x\)和它的子节点\(y\)

我们考虑\(x\)\(y\)之间的边对答案的贡献。

这个贡献就是这条边[(一侧的黑点数\(\times\)另一侧的黑点数)+(一侧的白点数\(\times\)另一侧的白点数)]\(\times\)边权。

为什么呢?

显然对于任意位于这条边两侧的同色点,它们之间的路径必然经过这条边。

我们设这次合并之前的\(dp_x\)\(ldp\),这条边边权为\(ev\),那么有

\(dp_{x,i}=max\{dp_{y,j}+ldp_{i-j}+j\times(k-j)\times ev+(sz_y-j)\times(n-k-sz_y+j)\times ev\}\)

但是这样看起来单次合并是\(O(n^2)\)的,总时间复杂度就是\(O(n^3)\)的。

一开始我也是这么认为的。

一交发现过了,而且跑的很快。

它实际上似乎是\(O(n^2)\)的。

为什么呢?

树形dp复杂度太玄学了

code:

#include<bits/stdc++.h>
#define Add(l,r,val) (c[l]+=val,c[r+1]-=val)
#define Sum(l,r) (sum[r]-(l?sum[l-1]:0))
using namespace std;
struct edge{
    int t,v,nxt;
}e[4010];
int n,k,u,v,w,cnt,be[2010],sz[2010];
long long dp[2010][2010],cpy[2010],ans;
void add(int x,int y,int val){
    e[++cnt].t=y,e[cnt].v=val,e[cnt].nxt=be[x],be[x]=cnt;
}
void Merge(int x,int y,int ev){
    for(int i=0;i<=k;++i)cpy[i]=dp[x][i],dp[x][i]=0;
    for(int i=0;i<=k&&i<=sz[y];++i)for(int j=0;i+j<=k&&j<=sz[x];++j)dp[x][i+j]=max(dp[x][i+j],dp[y][i]+cpy[j]+1ll*ev*i*(k-i)+1ll*ev*(sz[y]-i)*(n-k-sz[y]+i));
}
void TDP(int x){
    sz[x]=1;
    for(int i=be[x];i;i=e[i].nxt)!sz[e[i].t]?TDP(e[i].t),Merge(x,e[i].t,e[i].v),sz[x]+=sz[e[i].t],0:0;
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<n;++i)scanf("%d%d%d",&u,&v,&w),add(u,v,w),add(v,u,w);
    TDP(1);
    printf("%lld",dp[1][k]);
    return 0;
}

转载于:https://www.cnblogs.com/xryjr233/p/BZOJ4033.html

相关文章:

  • 正确优雅地解决用户退出——JSP及Struts解决方案
  • 亚马逊是如何进行软件开发的
  • zookeeper系列之一—zookeeper入门
  • vuex视频教程
  • 关于 +new Date 的个人见解
  • JOB SERVER 负载均衡
  • 如何保护云中的工作负载
  • mysql触发器的作用及语法
  • CSS 通用原子类
  • 二、 vSphere 6.7 U1(二):对Esxi主机设置
  • 基础面试题String、变量、类与对象、集合类、SSH
  • Android中Activity启动模式详解
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • Git 文件操作
  • 阶乘后的零[LeetCode-172]
  • [笔记] php常见简单功能及函数
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Angular数据绑定机制
  • ES10 特性的完整指南
  • Js基础知识(一) - 变量
  • linux学习笔记
  • MD5加密原理解析及OC版原理实现
  • Python学习笔记 字符串拼接
  • React-flux杂记
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • zookeeper系列(七)实战分布式命名服务
  • 力扣(LeetCode)56
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 为视图添加丝滑的水波纹
  • 我的zsh配置, 2019最新方案
  • 一个项目push到多个远程Git仓库
  •  一套莫尔斯电报听写、翻译系统
  • 一些关于Rust在2019年的思考
  • 译米田引理
  • 怎样选择前端框架
  • 主流的CSS水平和垂直居中技术大全
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 阿里云ACE认证学习知识点梳理
  • 湖北分布式智能数据采集方法有哪些?
  • ​渐进式Web应用PWA的未来
  • # Maven错误Error executing Maven
  • #### go map 底层结构 ####
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #微信小程序:微信小程序常见的配置传值
  • (C语言)fread与fwrite详解
  • (vue)页面文件上传获取:action地址
  • (接口自动化)Python3操作MySQL数据库
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .htaccess 强制https 单独排除某个目录
  • .java 9 找不到符号_java找不到符号
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core WebAPI中封装Swagger配置