随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

例子: luogu <选课>

 课程有依赖关系形成树状结构,每个节点有价值a[i],     若选择X节点  则必须选择其父节点,最多选m个节点

 问能获得的最大价值

 f[u][i][j] 结点u,可用体积为j(节点个数),考虑前i个子节点,能获得的最大价值

我们枚举第i个点分配的体积k

f[u][i][j]= max{ f[u][i-1][j-k]+f[y][size(y)][k]

滚动数组优化

f[u][j]=max(f[u][j-k]+f[y][k]}

#include <cstdio>

 const int N=304,M=2*N;
 int a[N],n,m,all,nxt[M],go[M],hd[N];
 int f[N][30002];
 
 inline int max(int x,int y){
 	return x>y?x:y;
 }
 void add(int x,int y){
 	go[++all]=y,nxt[all]=hd[x],hd[x]=all;
 }
 void dp(int x){
 	int i,j,k,y; f[x][1]=a[x];
 	
 	for(i=hd[x];i;i=nxt[i]){
 		y=go[i]; dp(y);
 		
 		for(j=m;j>=0;j--)
 		 for(k=0;k<j;k++){
 		 	 f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]);
 		 }
 	}
 }
 signed main(){
 	 scanf("%d%d",&n,&m); m++;
 	 int i,x,y;
 	 
 	 for(i=1;i<=n;i++) scanf("%d%d",&x,a+i),add(x,i);
 	 
 	 dp(0);
 	 printf("%d\n",f[0][m]);
 }
 
 

posted on   towboat  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示