f[u][j] =max( f[y][k] +f[u][j-k]- w[i] )
#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;} } }
标签:sz,nxt,int,有线电视,void,go,P1273,hd From: https://www.cnblogs.com/towboa/p/17183618.html