全WA求调,悬关
查看原帖
全WA求调,悬关
756179
so_find_skind楼主2023/8/20 10:21
#include<bits/stdc++.h>
using namespace std;
int n,k,gg,a[305];
std::map<int,int>f[305][305];
std::vector<int>g[305];
int dp(int u,int k,int r){//根节点为u,选k个点,并且无视g[u][0]~g[u][r-1]的子节点
    if(f[u][k][r]!=0)//记忆化
        return f[u][k][r];
    if(g[u].empty()){//这是叶子节点
        if(!k)
            return 0;
        return f[u][k][r]=a[u];
    }
    if(!k)//不用选
        return 0;
    if(g[u].size()==1 || r==g[u].size()-1)//当只有一个子树时,选根并转移到该子树上
        return f[u][k][r]=a[u]+dp(g[u][r],k-1,0);
    int ans=0;
    for(int i=0;i<=k;i++){//枚举子树g[u][r]该选多少个
        ans=std::max(ans,dp(g[u][r],i,0)+dp(u,k-i,r+1));
    }
    return f[u][k][r]=ans;
}
int main(){
    std::cin>>n>>k;
    for(int i=1;i<=n;i++){
        std::cin>>gg>>a[i];
        g[gg].push_back(i);//存树,gg=0的时候也会如此,代表将多个不相干的树添一个共同根
    }
    k++;//因为多出来一个0结点作为新的根
    std::cout<<dp(0,k,0);
    return 0;
}
2023/8/20 10:21
加载中...