博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【树形dp】vijos P1180 选课
阅读量:6826 次
发布时间:2019-06-26

本文共 1449 字,大约阅读时间需要 4 分钟。

题解:

http://www.cppblog.com/rakerichard/articles/105004.html

惊了,讨论子树大小能否dp真鸡儿麻烦,按照上面那份题解,可以不用分这么多类,可以直接用dp(U,K)表示能最多选K个,而非恰好选K个时的答案。

UPDATE:我真鸡儿傻逼,将不存在的结点记作0,根节点记作n+1,可以有效避免讨论结点的存在性。dp(0,K)=0。

#include
#include
#include
using namespace std;int f[310][310],siz[310];struct Node{ int lc,rc,v;}T[310];int n,m;int dp(int U,int K){ if(f[U][K]!=-1){ return f[U][K]; } if(K==0){ return f[U][K]=0; } if(siz[U]==1 && K==1){ return f[U][K]=T[U].v; } if(T[U].rc){ if(siz[T[U].rc]>=K){ f[U][K]=dp(T[U].rc,K); } if(siz[T[U].rc]>=K-1){ f[U][K]=max(f[U][K],dp(T[U].rc,K-1)+T[U].v); } } if(T[U].lc){ if(!T[U].rc){ f[U][K]=max(f[U][K],dp(T[U].lc,K-1)+T[U].v); } else{ for(int j=0;j
=j && siz[T[U].rc]>=K-j-1){ f[U][K]=max(f[U][K],dp(T[U].lc,j)+dp(T[U].rc,K-j-1)+T[U].v); } } } } return f[U][K];// f[U][K]=max(f[right[i]][j],d[left[i]][k]+d[right[i]][j-k-1]);}void dfs(int U){ siz[U]=1; if(T[U].lc){ dfs(T[U].lc); siz[U]+=siz[T[U].lc]; } if(T[U].rc){ dfs(T[U].rc); siz[U]+=siz[T[U].rc]; } }int main(){// freopen("vijos1180.in","r",stdin); memset(f,-1,sizeof(f)); int x; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ scanf("%d%d",&x,&T[i].v); if(!T[x].lc){ T[x].lc=i; } else{ int U=T[x].lc; while(T[U].rc){ U=T[U].rc; } T[U].rc=i; } } dfs(0); printf("%d\n",dp(T[0].lc,m)); return 0;}

转载于:https://www.cnblogs.com/autsky-jadek/p/6583262.html

你可能感兴趣的文章
【C#】在父窗体菜单合并子窗体菜单
查看>>
反射(6)程序集加载上下文
查看>>
oracle触发器after update of |更改之后赋值|
查看>>
Oracle命令:授权-收回权限-角色-用户状态
查看>>
常用的Ubuntu APT命令参数
查看>>
成功加盟者的8个特点
查看>>
Java基础03 构造器与方法重载
查看>>
如何让你的服务屏蔽Shodan扫描
查看>>
SpringBoot+Elasticsearch
查看>>
Vim 操作符命令和动作命令
查看>>
动态代理
查看>>
C语言 格式化输出--%m.n
查看>>
gradle配置国内的镜像
查看>>
Gitlab安装与备份恢复
查看>>
Elasticsearch-sql 用SQL查询Elasticsearch
查看>>
(原創) 如何讓Nios II自動抓到自己寫的IP的HAL? (SOC) (Nios II) (SOPC Builder) (DE2-70)
查看>>
JFS技术详细介绍
查看>>
Linux VI command
查看>>
创建可重用的对象
查看>>
jquery easyui treegrid使用小结:二
查看>>