标签:dp
把0作为根,然后dp
注意一点 就是以前是选取m个点 现在相当于选取了m+1个点
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; int dp[222][222]; vector<int>mp[222]; int val[222]; int vis[222]; int n,m; void dfs(int u){ vis[u]=1; dp[u][1]=val[u]; for(int i=0;i<mp[u].size();i++){ int v = mp[u][i]; if(vis[v]) continue; dfs(v); for(int j=m+1;j>1;j--){ for(int k=1;k<j;k++){ dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); } } } } int main(){ while(scanf("%d%d",&n,&m)==2){ if(n==0&&m==0) break; for(int i=0;i<=n;i++){ mp[i].clear(); } for(int i=1;i<=n;i++){ int a,b; scanf("%d%d",&a,&b); mp[a].push_back(i); val[i]=b; } memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); vis[0]=1; dfs(0); printf("%d\n",dp[0][m+1]); } }
标签:dp
原文地址:http://blog.csdn.net/u013076044/article/details/46046261