hdu 5148 Cities(树形背包)
来源:互联网 发布:cf彩虹哥淘宝 编辑:程序博客网 时间:2024/05/01 14:43
题意:
给出一棵树,现在要选择k个点,要求这个k个点组成的路的平均值(即期望)要最小,路径的综合可以这样计算 :
∑Ki∑Kj dis(vi,vj)
题解:题目要求输出的是结果乘以k^2,那么这样就可以要求的其实就是
∑Ki∑Kj dis(vi,vj)
这个式子!
ok,那么状态就可以设为:dp[i][j] 根节点i选择j个点得到的最小路径和。
状态方程:dp[fa][i] = max { dp[fa][i], dp[fa][j-i] + dp[son][j] + (k-j)*j*2*E[i].w }
(k-j)*j*2代表父亲到子树那条边被覆盖的次数。
#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;typedef __int64 lld;const lld oo=1LL<<60;#define maxn 2005lld dp[maxn][52];struct EDGE{ int v,w,next;}E[maxn<<1];int head[maxn],tol;int n,K;void inst(){ memset(head,-1,sizeof head); tol=0;}void add_edge(int u,int v,int w){ E[tol].v=v; E[tol].w=w; E[tol].next=head[u]; head[u]=tol++;}void tree_dp(int u,int pre){ for(int i=2;i<=n;i++) dp[u][i]=oo; dp[u][0]=dp[u][1]=0; for(int i=head[u];i!=-1;i=E[i].next) { int v=E[i].v; if(v==pre) continue; tree_dp(v,u); for(int j=K;j>=1;j--) for(int k=1;k<=j;k++) dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v][k]+k*(K-k)*2*E[i].w); }}int main(){ int T,u,v,w; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&K); inst(); for(int i=1;i<=n-1;i++) { scanf("%d%d%d",&u,&v,&w); add_edge(u,v,w); add_edge(v,u,w); } tree_dp(1,-1); printf("%I64d\n",dp[1][K]); } return 0;}
Ki=1∑Kj=1dis(vi,vj)
0 0
- hdu 5148 Cities(树形背包)
- HDU 5148 Cities 树形DP(背包)
- hdu 5148 Cities(树形dp)
- hdu 5148Cities 树形dp
- HDU 5148(Cities-树上背包)
- 【树形DP】 HDOJ 5148 Cities
- hdu 5148 树形dp+分组背包问题
- hdu 5148 树形dp,分组背包
- hdu 1011 树形背包
- hdu 1011 树形背包
- hdu 1054 树形背包
- hdu 4276 树形背包
- HDU 5148 Cities
- hdu 5148 Cities dp
- HDU 5148 Cities
- hdu 1011 树形dp 背包
- hdu 4276 树形dp背包
- HDU 4276 树形dp + 背包
- iOS微信支付
- ORA-00119和ORA-00132解决方法
- 前端学习打卡day2--morning
- 汇编基本指令的学习
- mysql基准测试--sysbench
- hdu 5148 Cities(树形背包)
- IOS8开发视频教程之:基于Swift实战UI从入门到精通
- 设计模式之“行为型模式”(二)
- android 学习视频 很全的一套视频 包括实例代码带你了解android
- vim中自动补全的快捷键
- 从乌云看企业安全那些事儿
- Salt-API安装配置及使用
- JS读秒跳转
- 字符串转换为数字(完整标准版)