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

 

 f[u][j] =max( f[y][k] +f[u][j-k]- w[i] )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
using namespace std ;
 const int N=3002,M=N*5,inf=0x7f7f3f;
 int n,m,sz[N];
 int a[N],nxt[M],go[M],hd[N],w[M],f[N][N],all;
  
 void add(int x,int y,int z){
    go[++all]=y; nxt[all]=hd[x],w[all]=z,hd[x]=all;
 }
 void init(int x){
    if(x>n-m) {
        sz[x]=1; return;
    }
     int i,y;
   for(i=hd[x];i;i=nxt[i]){ y=go[i],init(y); sz[x]+=sz[y];}
 }
 void dfs(int x){
    int i,j,y,k,s=0;
    if(x>n-m) return;
     
    for(i=hd[x];i;i=nxt[i]){
        y=go[i]; dfs(y);
        s+=sz[y];
         
        for(j=s;j>0;j--)
         for(k=1;k<=sz[y];k++)
     if(j-k>=0) f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]-w[i]);
    }
 }
  
 int main(){
    int i,j,x,y,t;
     cin>>n>>m;
    for(i=1;i<=n;i++) for(j=1;j<=n;j++) f[i][j]=-inf;
     
    for(i=1;i<=n-m;i++){
        cin>>t;
         
        while(t--){
            cin>>x>>y; add(i,x,y);
        }
    }
    for(i=n-m+1;i<=n;i++) cin>>f[i][1];
     
    for (i=1;i<=n;i++) f[i][0]=0;
    init(1),dfs(1);
     
    for(i=m;i>=1;i--){
        if(f[1][i]>=0){ cout<<i<<'\n';break;}
    }
 }

 

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