BZOJ 4033 [HAOI2015]树上染色 ——树形DP
可以去UOJ看出题人的题解。
这样的合并,每一个点对只在lca处被考虑到,复杂度$O(n^2)$
#include <map>
#include <ctime>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (ll i=j;i<=k;++i)
#define D(i,j,k) for (ll i=j;i>=k;--i)
#define ll long long
ll h[5005],to[5005],ne[5005],en=0,w[5005]; void add(ll a,ll b,ll c)
{to[en]=b;ne[en]=h[a];w[en]=c;h[a]=en++;} ll n,k,tmp[2005],m;
ll dp[2005][2005];
ll siz[2005]; void Tree_DP(ll o,ll fa)
{
dp[o][0]=dp[o][1]=0;
siz[o]=1;
for (ll i=h[o];i>=0;i=ne[i])
if (to[i]!=fa)
{
Tree_DP(to[i],o);
memset(tmp,-0x3f3f3f3f,(siz[o]+siz[to[i]]+2)*sizeof (ll));
for (ll j=0;j<=siz[o];++j)
for (ll k=0;k<=siz[to[i]];++k)
tmp[j+k]=max((ll)tmp[j+k],(ll)dp[o][j]+dp[to[i]][k]+(ll)w[i]*(k*(m-k)+(siz[to[i]]-k)*(n-m-(siz[to[i]]-k))));
siz[o]+=siz[to[i]];
for (ll j=0;j<=siz[o];++j) dp[o][j]=max((ll)tmp[j],dp[o][j]);
}
} int main()
{
memset(h,-1,sizeof h);
scanf("%lld%lld",&n,&m);
F(i,2,n)
{
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
add(a,b,c); add(b,a,c);
}
memset(dp,-0x3f3f3f3f,sizeof (dp));
Tree_DP(1,0);
printf("%lld\n",dp[1][m]);
}
BZOJ 4033 [HAOI2015]树上染色 ——树形DP的更多相关文章
- bzoj 4033: [HAOI2015]树上染色 [树形DP]
4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...
- BZOJ 4033: [HAOI2015]树上染色题解
BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
- BZOJ 4033[HAOI2015] 树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3188 Solved: 1366[Submit][Stat ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- [BZOJ4033][HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2437 Solved: 1034[Submit][Stat ...
- 【BZOJ4033】[HAOI2015]树上染色 树形DP
[BZOJ4033][HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染 ...
- bzoj4033 [HAOI2015]树上染色——树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 树形DP,状态中加入 x 与父亲之间的边的贡献: 边权竟然是long long... ...
- bzoj 4033: [HAOI2015]树上染色【树形dp】
准确的说应该叫树上分组背包?并不知道我写的这个叫啥 设计状态f[u][j]为在以点u为根的子树中有j个黑点,转移的时候另开一个数组,不能在原数组更新(因为会用到没更新时候的状态),方程式为g[j+k] ...
随机推荐
- android Random的使用
一.Random 此类的实例用于生成伪随机数流.此类使用 48 位的种子,使用线性同余公式 (linear congruential form) 对其进行了修改. 如果用相同的种子创建两个 Rando ...
- 洛谷 P2347 砝码称重 != codevs 2144
题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝 ...
- java里面byte数组和String字符串怎么转换
//string 转 byte[] String str = "Hello"; byte[] srtbyte = str.getBytes(); // byte[] 转 strin ...
- 换个语言学一下 Golang (5)——运算符
运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 接下来让我们来详细看看各个运算符的介绍. 算术运算符 下表 ...
- numpy.random.randint
low.high.size三个参数.默认high是None,如果只有low,那范围就是[0,low).如果有high,范围就是[low,high). >>> np.random.ra ...
- python已安装好第三方库,pycharm import时仍标红的解决办法
pip install pymysql之后导入import pymysql时候标红 发现 pymysql下方还是标红,不能正常导入 可以试用一下以下的办法 解决办法: 首先打开 Settings找到P ...
- Luogu P2397 yyy loves Maths VI (mode)
题目传送门 虽然只是一道黄题,但还是学到了一点新知识-- 摩尔投票法 用\(O(1)\)的内存,\(O(n)\)的时间来找出一串长度为n的数中的众数,前提是众数出现的次数要大于\(n/2\) 方法很简 ...
- passive event 解决方法
为了让页面滚动的效果如丝般顺滑,从 chrome56 开始,在 window.document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 pass ...
- luogu2312 解方程 (数论,hash)
luogu2312 解方程 (数论,hash) 第一次外出学习讲过的题目,然后被讲课人的一番话惊呆了. 这个题,我想着当年全国只有十几个满分.....然后他又说了句我考场A这道题时,用了5个模数 确实 ...
- 【模拟】bzoj1686: [Usaco2005 Open]Waves 波纹
打完模拟题来庆祝一波:):感觉最近陷入一种“口胡五分钟打题两小时”的巨坑之中…… Description Input 第1行:四个用空格隔开的整数Pj Bi,B2,R. P(1≤P≤5)表示石 ...