傻逼依赖背包的优化
#include<bits/stdc++.h> using namespace std; #define N 205 struct Edge{int to,nxt;}e[N<<1]; int head[N],tot,n,m,a[N]; void init(){memset(head,-1,sizeof head);tot=0;} void add(int u,int v){ e[tot].to=v;e[tot].nxt=head[u];head[u]=tot++; } int dp[N][N]; void dfs(int u,int pre,int C){ for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; if(v==pre)continue; for(int j=0;j<=C-1;j++) dp[v][j]=dp[u][j]+a[v]; dfs(v,u,C-1); for(int j=1;j<=C;j++) dp[u][j]=max(dp[u][j],dp[v][j-1]); } } int main(){ while(cin>>n>>m && n){ init(); for(int i=1;i<=n;i++){ int fa;cin>>fa>>a[i]; add(i,fa);add(fa,i); } memset(dp,0,sizeof dp); dfs(0,0,m); int ans=0; for(int j=0;j<=m;j++) ans=max(ans,dp[0][j]); cout<<ans<<endl; } }
原文:https://www.cnblogs.com/zsben991126/p/11386467.html