hdu 1561(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561
思路:dp[u][i]表示以u为根的树选了i个子节点。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 #define MAXN 222 8 9 int n,m; 10 int dp[MAXN][MAXN]; 11 int val[MAXN]; 12 vector<vector<int> >G; 13 14 void dfs(int u,int father) 15 { 16 for(int i=0;i<G[u].size();i++){ 17 int v=G[u][i]; 18 if(v==father)continue; 19 dfs(v,u); 20 for(int j=m;j>=1;j--){ 21 for(int k=1;k<=j;k++){ 22 dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); 23 } 24 } 25 } 26 if(u!=0){ 27 for(int j=m;j>=1;j--){ 28 dp[u][j]=dp[u][j-1]+val[u]; 29 } 30 } 31 } 32 33 int main() 34 { 35 int u,w; 36 while(~scanf("%d%d",&n,&m)){ 37 if(n==0&&m==0)break; 38 G.clear(); 39 G.resize(n+2); 40 for(int i=1;i<=n;i++){ 41 scanf("%d%d",&u,&w); 42 G[u].push_back(i); 43 val[i]=w; 44 } 45 memset(dp,0,sizeof(dp)); 46 dfs(0,-1); 47 printf("%d\n",dp[0][m]); 48 } 49 return 0; 50 } 51 52 53 54 55 56 57