当前位置:编程学习 > C/C++ >>

hdu1561树形DP入门

hdu1561The More,The Better
推荐题解
dp[ i ] [ j ]  以节点i为跟,取j个(包括i,即dp[i][1]=V[i])所能得到的最大值
[cpp]
#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<vector>  
using namespace std;  
  
int N,M,v[223];  
vector<int>son[223];  
  
int dp[223][223];  
  
void dfs(int n,int left){  
    int i,j,k,len=son[n].size();  
    dp[n][1]=v[n];  
    for(i=0;i<len;i++){  
        if(left>1)   dfs(son[n][i],left-1);  
        for(j=left;j>=1;j--)  
            for(k=1;k<=j;k++)  
                if(dp[n][j+1]<   dp[n][j+1-k]    +dp[son[n][i]][k])  dp[n][j+1]=dp[n][j+1-k]+dp[son[n][i]][k];  
    //                          其他儿子的总值     第i个儿子取k个  
    }  
}  
  
int main()  
{  
    int i,j,k;  
      
    while(scanf("%d%d",&N,&M),N||M)  
    {  
        //  
        memset(v,0,sizeof(v));  
        memset(dp,0,sizeof(dp));  
        for(i=0;i<=N;i++)    son[i].clear();  
        //  
        for(i=1;i<=N;i++){  
            scanf("%d%d",&j,&v[i]);  
            son[j].push_back(i);  
        }  
          
        dfs(0,M+1);  
          
        printf("%d\n",dp[0][M+1]);  
    }  
    return 0;  
}  
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,