准确的说应该叫树上分组背包?并不知道我写的这个叫啥

设计状态f[u][j]为在以点u为根的子树中有j个黑点,转移的时候另开一个数组,不能在原数组更新(因为会用到没更新时候的状态),方程式为g[j+k]=max(g[j+k],f[u][j]+f[e[i].to][k]+(k*(m-k)+(si[e[i].to]-k)*(n-m-(si[e[i].to]-k)))*e[i].va);,其中m'为题目描述中的k。

关于这个方程的由来,考虑一条边对答案的贡献,显然是这条边一边的黑点数量*另一边的黑点数量+一边的白点数量*另一边的白点数量,再乘上边权。

注意:size要在dp中加,dp完一棵子树再加上这棵子树的size。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=2005;
long long n,m,h[N],cnt,f[N][N],si[N],g[N];
struct qwe
{
long long ne,to,va;
}e[N<<1];
long long read()
{
long long r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(long long u,long long v,long long w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
// void dfs(long long u,long long fa)
// {
// si[u]=1;
// for(long long i=h[u];i;i=e[i].ne)
// if(e[i].to!=fa)
// {
// dfs(e[i].to,u);
// si[u]+=si[e[i].to];
// }
// }
void dp(long long u,long long fa)
{
si[u]=1;
for(long long i=h[u];i;i=e[i].ne)
if(e[i].to!=fa)
{
dp(e[i].to,u);
memset(g,0,sizeof(g));
for(long long j=0;j<=min(m,si[u]);j++)
for(long long k=0;k<=min(m,si[e[i].to]);k++)
if(j+k<=m)
g[j+k]=max(g[j+k],f[u][j]+f[e[i].to][k]+(k*(m-k)+(si[e[i].to]-k)*(n-m-(si[e[i].to]-k)))*e[i].va);
for(long long j=0;j<=m;j++)
f[u][j]=g[j];
si[u]+=si[e[i].to];
}
}
int main()
{
n=read(),m=read();
for(long long i=1;i<n;i++)
{
long long x=read(),y=read(),z=read();
add(x,y,z);
add(y,x,z);
}
//dfs(1,0);
dp(1,0);
printf("%lld\n",f[1][m]);
return 0;
}

最新文章

  1. 牛顿法求平方根 scala
  2. boost any库
  3. java 三个循环的优缺点
  4. Spring+struts2的基础上继续加hibernate3的jar包
  5. asp.net之treeview无法显示树结点图标(IP与域名的表现竟不一样)
  6. NSUserDefaults简介及使用
  7. MySQL中四舍五入的实现
  8. Smarty s01
  9. 【转】iOS高级向的十道面试问题
  10. 分布式数据库hbase详解
  11. 卡特兰数(Catalan Number) 算法、数论 组合~
  12. 排序算法Java实现(直接插入排序)
  13. java类.方法创建.继续调用
  14. 关于字符的C++函数
  15. const读书笔记
  16. Ceres入门笔记
  17. webpack 多页面|入口支持和公共组件单独打包--转载
  18. MySQL对索引的使用
  19. JS操作JSON常用方法
  20. pta 习题集 5-5 最长连续递增子序列 (dp)

热门文章

  1. Space Ant--poj1696(极角排序)
  2. win8,win10里面内置的IE浏览器网银无法输入密码
  3. Python的环境变量设置
  4. 【c++】【转】结构体字节对齐
  5. Linux 的 Socket IO 模型
  6. VC++ VS2010 error LNK1123 转换到 COFF 期间失败 怎么办
  7. ACdream原创群赛(13)のwuyiqi退役专场 C True love
  8. Python爬虫开发【第1篇】【爬虫案例】
  9. HDU 1015 Safecracker(第一次用了搜索去遍历超时,第二次用for循环能够了,思路一样的)
  10. sql里的in对应linq的写法 及 IQueryable转化为Dictionary