[2017纪中10-26]摘Galo 树型背包
题面
裸的树型背包。f[i][j]表示i的子树中选了j个的最优值。
O(n*k^2)+常数优化代码:
#include<iostream>
#include<cstdio>
#define chkmax(a,b) a=max(a,b)
#define ll long long
using namespace std;
const int maxn=100010;
int n,k,w[maxn],sz[maxn];
ll f[10010][1010];
struct edge
{int t;edge *next;
}*con[maxn];
void ins(int x,int y)
{edge *p=new edge;p->t=y;p->next=con[x];con[x]=p;
}
void dp(int v)
{for(int i=k+1;i>0;i--)f[v][i]=-1e18;for(edge *p=con[v];p;p=p->next){dp(p->t);sz[v]+=sz[p->t];for(int i=min(sz[v],k+1);i>=0;i--)for(int j=0;j<=min(i,sz[p->t]);j++)chkmax(f[v][i],f[v][i-j]+f[p->t][j]);}if(con[v]==NULL) sz[v]=1;chkmax(f[v][1],(ll)w[v]);
}
int main()
{scanf("%d%d",&n,&k);for(int i=2;i<=n;i++){int fa;scanf("%d%d",&fa,&w[i]);ins(fa,i);}dp(1);ll ans=0;for(int i=0;i<=k+1;i++)chkmax(ans,f[1][i]);printf("%lld",ans); return 0;
}
O(n*k)DFS序做法:
#include<iostream>
#include<cstdio>
#define chkmax(a,b) a=max(a,b)
#define ll long long
using namespace std;
const int maxn=100010;
int n,k,w[maxn],sz[maxn],tim,dfn[maxn];
ll f[10010][1010];
struct edge
{int t;edge *next;
}*con[maxn];
void ins(int x,int y)
{edge *p=new edge;p->t=y;p->next=con[x];con[x]=p;
}
void dfs(int v)
{dfn[++tim]=v;sz[v]=1;for(edge *p=con[v];p;p=p->next){dfs(p->t);sz[v]+=sz[p->t];}
}
int main()
{scanf("%d%d",&n,&k);k++;for(int i=2;i<=n;i++){int fa;scanf("%d%d",&fa,&w[i]);ins(fa,i);}dfs(1);for(int i=n;i>=1;i--)for(int j=1;j<=k;j++) f[dfn[i]][j]=max(f[dfn[i+sz[dfn[i]]]][j-1]+w[dfn[i]],f[dfn[i+1]][j]);ll ans=0;for(int i=0;i<=k;i++)chkmax(ans,f[dfn[1]][i]);printf("%lld",ans); return 0;
}
[2017纪中10-26]摘Galo 树型背包相关推荐
- [2017纪中10-25]凤凰院修真 LCIS最长公共上升子序列
题面 f[i][j]表示a序列考虑到i,b序列考虑到j且b[j]必须选的最长长度. a[i]!=b[j]时,f[i][j]=f[i-1][j]. 那么当a[i]==b[j]时,f[i][j]=max{ ...
- [2017纪中10-25]嘟噜噜 约瑟夫问题 递推
题面 假如n=1,显然留下的1号已经幸存. 假如n< m,我们每次杀掉m%n那个人,然后转化为(n-1,m)的子问题,求出子问题再倒推回来.最多做(n< m<=1e5)次. 假如n& ...
- 2019年暑假 纪中培训总结
前言 这次期末考完估计级排80+80+80+.反正语文.数学.英语.历史.政治.地理都感觉考差了. 结果语文.英语.政治.历史.地理.物理都考得跟shi一样 语文做题时漏了两道题,心态很崩.作文和阅读 ...
- SSL2811 2017年10月30日提高组T2 摘Galo(树形dp)
2017年10月30日提高组T2 摘Galo Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有 ...
- 【SSLGZ 2811】2017年10月30日提高组T2 摘Galo
问题描述 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Galo,美味度为w ...
- JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo
Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...
- 纪中国庆10.5做题小结
纪中国庆10.5做题小结 T1:教主的花园 T2:教主泡嫦娥 T3:保镖排队 T4:教主的别墅 T1:教主的花园 Description [问题背景] LHX教主最近总困扰于前来膜拜他的人太多了,所以 ...
- 【NOIP2017提高A组集训10.25】摘Galo (树形dp)
Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...
- 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo
Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...
最新文章
- 关于测试行业的零星思考
- 解决 : Shell 脚本 $‘\r‘: command not found 问题
- Tensorflow——张量
- maven多个子项目、父项目之间的引用问题
- mysql error report,ECSHOP网店系统提示MYSQL SERVER ERROR REPORT的解决方法
- [CSS揭秘]伪随机背景
- 《统计学习方法》读书笔记——朴素贝叶斯法(公式推导+代码实现)
- 交通灯程序设计C语言,单片机C语言程序设计:LED 模拟交通灯
- ToolsOh第4批收录
- 乐优商城(14)–订单服务
- 小麦颗粒数目matlab,求关于matlab中rice.png图像中的米粒数目的算法
- Aho-Corasick Automaton · AC自动机
- 【学习笔记】傅里叶变换: 方形函数,三角函数
- DNA分子结构3D模型
- 基本表改变视图不改变为什么_为什么说10万本金以下穷人玩股票一般都会赔?不改变穷人思维,还不如退出股市...
- 基础数学(八)——期末考试复习
- 查看oracle11g的企业管理器(OEM)
- 【用户画像】实现宽表合并,pivot概述,源码实现并发布任务
- 小时候真傻,居然想着快快长大
- 我电脑感染了一种奇怪的病毒,它点中了我的笑穴!