HDU 1561 The more, The Better 树形DP(0-1背包)

中文题,题意自己看

树形DP

将0设为根节点,总攻击数为m,背包容量应该是m+1(0点也看做城堡);

基础的树形DP,自己推一下状态转移方程吧。 

View Code
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>edge[224];
int dp[224][224];
int p[224],m, n;
void dfs(int u)
{
    int i, j, k;
    dp[u][1]=p[u];//初始化
    for(i=0;i<edge[u].size();i++)
    {
        int v = edge[u][i];
        dfs(v);
        //将子节点的状态转移给父节点
        for(j=m+1;j>=1;j--)
            for(k=1;k<j;k++)//注意,要攻击v,必须攻击u,所以j-k>=1;
                    dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
    }
}
int main( )
{
    int  i, j, x;
    while(~scanf("%d%d",&n,&m))
    {
        if(!n&&!m)break; 
        for(i=0;i<=n;i++)
             edge[i].clear();
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&p[i]);
            edge[x].push_back(i);
        }
        p[0]=0;memset(dp,0,sizeof(dp));
       dfs(0);
       printf("%d\n",dp[0][m+1]);
    }
    return 0;
}

 

posted @ 2012-08-14 16:52  To be an ACMan  Views(190)  Comments(0)    收藏  举报