hdu The more, The Better

把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)