HDU 1561 —— The more, The Better(树形DP + 背包)

题目:The more, The Better

中文题。。。

树形dp第二发。

初看之下是形成多棵树,其实可以把0也看做根节点,没有限制的那些就当成0的孩子,然后可以打败的数目M+1,抵消掉0这个结点。然后就可以快乐地dfs了。

求值方面可以用背包的方法,用子节点去更新当前节点。具体方程式见代码吧。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 210;
vector<int> V[N];
int n, m, w[N];
int dp[N][N];
void dfs(int x){
    dp[x][0]=0;
    for(int i=1; i<=m; i++)  dp[x][i]=w[x];
    for(int i=0; i<V[x].size(); i++){
        int j = V[x][i];
        dfs(j);
        for(int k=m; k>1; k--){
            for(int l=1; l<k; l++){
                dp[x][k] = max(dp[x][k], dp[j][l]+dp[x][k-l]);
            }
        }
    }
}
int main(){
    while(~scanf("%d %d", &n, &m) && (n||m)){
        m++;
        for(int i=0; i<=n; i++) V[i].clear();
        w[0]=0;
        int a;
        for(int i=1; i<=n; i++){
            scanf("%d %d", &a, w+i);
            V[a].push_back(i);
        }
        dfs(0);
        printf("%d\n", dp[0][m]);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值