【模板】多叉转二叉

例题

网上查多叉转二叉好处就是好实现(好打代码)?!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int dp[1001][1001],c[1001][1001],v[10001];
int Max(int X,int Y){
    return X>Y ? X : Y;
}
int dfs(int root,int sy){
    if(root==0||sy==0){
        dp[root][sy]=0;
        return 0;
    } 
    if(dp[root][sy]!=-1) return 0;
    dp[root][sy]=0;
    for(int i=0;i<sy;i++){
        dfs(c[root][0],i);
        dfs(c[root][1],sy-i-1);
        dp[root][sy]=Max(dp[root][sy],dp[c[root][0]][i]+dp[c[root][1]][sy-i-1]+v[root]);
    }
    dfs(c[root][1],sy);
    dp[root][sy]=Max(dp[root][sy],dp[c[root][1]][sy]);
}
int main(){
    memset(dp,-1,sizeof(dp));
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d%d",&x,&v[i]);
        if(c[x][0]==0) c[x][0]=i;
        else{
            int j=c[x][0];
            while(c[j][1]) j=c[j][1];
            c[j][1]=i;
        }
    }
    dfs(c[0][0],m);
    printf("%d",dp[c[0][0]][m]);
}

 

posted @ 2021-08-17 22:31  latent_Lin  阅读(49)  评论(0)    收藏  举报