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

bzoj 4033: [HAOI2015]树上染色 [树形DP]

4033: [HAOI2015]树上染色


我写的可是\(O(n^2)\)的树形背包!

注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 2005, P = 1e9+7;
inline int read() {
    char c=getchar(); int x=0,f=1;
    while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
    return x*f;
}

int n, m, mm, u, v;
struct edge{int v, ne, w;} e[N<<1];
int cnt, h[N];
inline void ins(int u, int v, int w) { 
    e[++cnt] = (edge){v, h[u], w}; h[u] = cnt;
    e[++cnt] = (edge){u, h[v], w}; h[v] = cnt;
}

ll f[N][N]; int size[N];
void dp(int u, int fa) { //printf("dp %d %d\n", u, fa);
    size[u] = 1;
    for(int i=h[u]; i; i=e[i].ne) {
        int v = e[i].v, w = e[i].w;
        if(v == fa) continue;
        dp(v, u);
        for(int j = min(size[u] + size[v], m); j >= 0; j--) {
            int _ = min(j, size[v]);
            for(int k = max(0, j - size[u]); k <= _; k++)
                f[u][j] = max(f[u][j], f[v][k] + f[u][j-k] + (ll) w * ( k * (m-k) + (size[v] - k) * (mm - size[v] + k) ) );
        }
        size[u] += size[v];
    }
    //printf("look %d  %d\n", u, size[u]);
    //for(int i=0; i<=min(size[u], m); i++) printf("f %d %d  %lld\n", u, i, f[u][i]);
    //puts("end\n");
}
int main() {
    //freopen("in", "r", stdin);
    freopen("haoi2015_t1.in", "r", stdin);
    freopen("haoi2015_t1.out", "w", stdout);
    n = read(); m = read(); mm = n - m;
    for(int i=1; i<n; i++) u = read(), v = read(), ins(u, v, read());
    dp(1, 0);
    printf("%lld\n", f[1][m]);
}

转载于:https://www.cnblogs.com/candy99/p/6810084.html

相关文章:

  • justgage.js的使用
  • requests模块
  • C#访问修饰符学习整理
  • 5.5下午
  • 『ORACLE』 创建表(11g)
  • javascript基础 方法
  • Objective-C语言精华概要
  • 【计划】2017年5月计划
  • Coder-Strike 2014 - Round 2
  • 线程的状态
  • jquery 实现考试倒计时
  • Android知识点textview加横线的属性
  • 配置链路聚合(端口聚合)
  • ELK常用API使用方法
  • oracle表空间增长异常或表空间占用过高问题分析
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • AHK 中 = 和 == 等比较运算符的用法
  • bootstrap创建登录注册页面
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript服务器推送技术之 WebSocket
  • Linux快速复制或删除大量小文件
  • Mybatis初体验
  • React Transition Group -- Transition 组件
  • Transformer-XL: Unleashing the Potential of Attention Models
  • underscore源码剖析之整体架构
  • vue.js框架原理浅析
  • 成为一名优秀的Developer的书单
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 解析 Webpack中import、require、按需加载的执行过程
  • 开源地图数据可视化库——mapnik
  • 前端临床手札——文件上传
  • 三分钟教你同步 Visual Studio Code 设置
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​Java并发新构件之Exchanger
  • #162 (Div. 2)
  • #QT(智能家居界面-界面切换)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (+4)2.2UML建模图
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (2015)JS ES6 必知的十个 特性
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (南京观海微电子)——I3C协议介绍
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .aanva
  • .NET BackgroundWorker
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net 获取url的方法
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET基础篇——反射的奥妙
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [20171113]修改表结构删除列相关问题4.txt