[HAOI2015] 树上染色(树形 DP)

news/2024/11/13 22:12:06/

题目传送门icon-default.png?t=O83Ahttps://www.luogu.com.cn/problem/P3177

解题思路

设 f(i,j) 表示以 i 为根的子树染 j 个黑点的最大收益值。

设一共有 n 个节点,要染 m 个点。

完成 DP 状态的设计后,开始推导转移方程……

对于一个点 x,它下面有一条通向 to,权值为 w 的边。

我们枚举 j,表示以 x 为根的子树已经染了 j 个点;

然后在枚举 k 表示以 to 为子树要染 k 个点;

然后,这条边的贡献会是多少呢?

首先,如果 to 为根的子树有 k 个被染的点,那么是不是 to 以外应该会有 m-k 个点,然后两边的点两两组合,得到的贡献是 k \times (m-k) \times w

然后,如果 to 为根的子树有 k 个被染的点,那么是不是 to 为根的子树就会有 size[to]-k 个白点?对于 to 以外,应该会有 (n-m-(size[to-k])) 个白点。同理,两两组合,贡献是:(size[to]-k) \times (n-m-(size[to-k])) \times w

(其中 size[to] 表示 to 为根的子树的大小)。

于是,我们可以从 1 号点开始 dfs,同时进行 DP。

代码

记得开 long long!

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
vector<pair<int,int> > g[2001];
int size[2001];
int f[2001][2001];void dfs(int x,int fa)
{size[x]=1;for(auto y:g[x]){int to=y.first;int w=y.second;if(to==fa)continue;dfs(to,x);for(int j=min(m,size[x]);j>=0;j--){for(int k=min(m,size[to]);k>=0;k--){if(j+k<=m){int temp;temp=k*(m-k)*w+(size[to]-k)*(n-m-(size[to]-k))*w;f[x][j+k]=max(f[x][j+k],f[x][j]+f[to][k]+temp);}}}size[x]+=size[to];}
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;int u,v,w;for(int i=1;i<=n-1;i++){cin>>u>>v>>w;g[u].push_back(make_pair(v,w));g[v].push_back(make_pair(u,w));}dfs(1,0);cout<<f[1][m];return 0;
}


http://www.ppmy.cn/news/1546764.html

相关文章

GitLab基于Drone搭建持续集成(CI/CD)

本文介绍了如何为 Gitee 安装 Drone 服务器。服务器打包为在 DockerHub 上分发的最小 Docker 映像。 1. 准备工作 创建OAuth应用 创建 GitLab OAuth 应用。Consumer Key 和 Consumer Secret 用于授权访问极狐GitLab 资源。 ps:授权回调 URL 必须与以下格式和路径匹配&…

golang 实现比特币内核:从公钥创建wallet地址

作为比特币用户,我们总是需要发送或接收比特币,这就需要让别人知道你的钱包地址。由于钱包地址需要人类读取,之前我们使用的编码方案产生的是二进制结果,因此我们需要一种新的方案,以人类友好的方式创建钱包地址。 钱包地址实际上是从公钥生成的,并且需要满足以下要求:…

stable-diffusion-3 ,每天免费试用

https://huggingface.co/spaces/stabilityai/stable-diffusion-3-mediumhttps://huggingface.co/spaces/stabilityai/stable-diffusion-3-medium官方space&#xff0c;童叟无欺&#xff0c;科学试用。 an image of a girl with white hair, in the style of ross tran, light …

随堂测微信小程序ssm+论文源码调试讲解

2 关键技术简介 2.1 微信小程序 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种全新的连接用户与服务的方式&#xff0c;可以快速访问、快速传播&#xff0c;并具有良好的使用体验。 小程序的主要开发语言是JavaScript&#xff0c;它与…

重构代码之替换参数为显式方法

替换参数为显式方法 是一种重构技术&#xff0c;旨在通过替换方法参数来创建更清晰、更具可读性的代码。当一个方法包含标志性参数时&#xff0c;该方法的行为可能会根据参数的不同而发生改变。这样会导致方法的调用方式不够明确&#xff0c;因为调用者不一定能直观地知道每个参…

设计模式-七个基本原则之一-单一职责原则 + SpringBoot案例

单一职责原理:(SRP) 面向对象七个基本原则之一 清晰的职责&#xff1a;每个类应该有一个明确的职责&#xff0c;避免将多个责任混合在一起。降低耦合&#xff1a;通过将不同的职责分开&#xff0c;可以降低类之间的耦合度&#xff0c;提高系统的灵活性。易于维护&#xff1a;当…

Oracle 高水位线和低-高水位线(High Water Mark Low High Water Mark)

在Oracle的逻辑存储结构中&#xff08;表空间-段-区-块&#xff09;&#xff0c;数据是存在数据段中的&#xff0c;通常一个表就是一个数据段&#xff0c;而段最终又由许多数据块组成。当数据存入数据块时&#xff0c;需要对块进行格式化&#xff0c;高水位线&#xff08;High …

【AI日报】2024年11月13号

我回来啦&#xff01;&#xff01;发现自己好久不发文章了。 在某头部AI公众号实习的过程中&#xff0c;学到太多太多了&#xff0c;也感谢某位大神的指点&#xff0c;也衷心祝愿他的IP可以越做越好 之后因为时间关系&#xff0c;可能要自己出来单干了。 在实习过程中学到的…